• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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