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