1# Worker和宿主线程的即时消息通信
2
3
4在ArkTS中,Worker相对于Taskpool存在一定的差异性,有数量限制但是可以长时间存在。一个[Worker](worker-introduction.md)中可能会执行多个不同的任务,每个任务执行的时长或者返回的结果可能都不相同,宿主线程需要根据情况调用Worker中的不同方法,Worker则需要及时地将结果返回给宿主线程。
5
6
7下面以Worker响应"hello world"请求为例进行说明。
8
9
101. 首先,创建一个执行多个任务Worker。
11
12   ```ts
13   // Worker.ets
14   import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
15
16   const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
17   // Worker接收宿主线程的消息,做相应的处理
18   workerPort.onmessage = (e: MessageEvents): void => {
19     if (e.data === 'hello world') {
20       workerPort.postMessage('success');
21     }
22   }
23   ```
24
252. 这里的宿主线程为UI主线程,在宿主线程中创建这个Worker的对象,在点击Button的时候调用postmessage向Worker发送消息,通过Worker的onmessage方法接收Worker返回的数据。
26
27   ```ts
28   // Index.ets
29   import { worker } from '@kit.ArkTS';
30   import { BusinessError } from '@kit.BasicServicesKit';
31
32   function promiseCase() {
33     let p: Promise<void> = new Promise<void>((resolve: Function, reject: Function) => {
34       setTimeout(() => {
35         resolve(1);
36       }, 100)
37     }).then(undefined, (error: BusinessError) => {
38     })
39     return p;
40   }
41
42   async function postMessageTest() {
43     let ss = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
44     let res = undefined;
45     let flag = false;
46     let isTerminate = false;
47     ss.onexit = () => {
48       isTerminate = true;
49     }
50     // 接收Worker线程发送的消息
51     ss.onmessage = (e) => {
52       res = e.data;
53       flag = true;
54       console.info("worker:: res is  " + res);
55     }
56     // 给Worker线程发送消息
57     ss.postMessage("hello world");
58     while (!flag) {
59       await promiseCase();
60     }
61
62     ss.terminate();
63     while (!isTerminate) {
64       await promiseCase();
65     }
66   }
67
68   @Entry
69   @Component
70   struct Index {
71     @State message: string = 'Hello World';
72     build() {
73       Row() {
74         Column() {
75           Text(this.message)
76             .fontSize(50)
77             .fontWeight(FontWeight.Bold)
78             .onClick(() => {
79               postMessageTest();
80             })
81         }
82         .width('100%')
83       }
84       .height('100%')
85     }
86   }
87   ```
88
89
90在上文这段示例代码中,Worker接收来自宿主线程的消息,并做了相应处理后把结果发回给宿主线程。这样就可以实现宿主线程和Worker间的即时通信,方便宿主线程使用Worker的运行结果。
91