• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Worker和宿主线程的即时消息通信
2<!--Kit: ArkTS-->
3<!--Subsystem: CommonLibrary-->
4<!--Owner: @lijiamin2025-->
5<!--Designer: @weng-changcheng-->
6<!--Tester: @kirl75; @zsw_zhushiwei-->
7<!--Adviser: @ge-yafang-->
8
9
10在ArkTS中,Worker相对于Taskpool存在一定的差异性,有数量限制但是可以长时间存在。一个[Worker](worker-introduction.md)中可能会执行多个不同的任务,每个任务的执行时长或返回结果可能都不同,宿主线程需要根据情况调用Worker中的不同方法,Worker则需要及时地将结果返回给宿主线程。
11
12
13下面以Worker响应"hello world"请求为例说明。
14
15
161. 首先,创建一个执行任务的Worker。创建方法可参考[创建worker的注意事项](worker-introduction.md#创建worker的注意事项)。
17
18   ```ts
19   // Worker.ets
20   import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
21
22   const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
23   // Worker接收宿主线程的消息,做相应的处理
24   workerPort.onmessage = (e: MessageEvents): void => {
25     if (e.data === 'hello world') {
26       workerPort.postMessage('success');
27     }
28   }
29   ```
30   <!-- @[create_worker_execute_multi_task](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/ArkTsConcurrent/ConcurrentThreadCommunication/InterThreadCommunicationScenario/entry/src/main/ets/workers/Worker.ets) -->
31
322. 这里的宿主线程是UI主线程,在宿主线程中创建Worker对象,当点击Button时调用postMessage方法向Worker线程发送消息,Worker线程将通过注册的onmessage回调处理宿主线程发送的消息。
33
34   ```ts
35   // Index.ets
36   import { worker } from '@kit.ArkTS';
37
38   function promiseCase() {
39     let p: Promise<void> = new Promise<void>((resolve: Function, reject: Function) => {
40       setTimeout(() => {
41         resolve();
42       }, 100);
43     });
44     return p;
45   }
46
47   async function postMessageTest() {
48     let ss = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
49     let res = undefined;
50     let flag = false;
51     let isTerminate = false;
52     ss.onexit = () => {
53       isTerminate = true;
54     }
55     // 接收Worker线程发送的消息
56     ss.onmessage = (e) => {
57       res = e.data;
58       flag = true;
59       console.info("worker:: res is  " + res);
60     }
61     // 给Worker线程发送消息
62     ss.postMessage("hello world");
63     while (!flag) {
64       await promiseCase();
65     }
66
67     ss.terminate();
68     while (!isTerminate) {
69       await promiseCase();
70     }
71   }
72
73   @Entry
74   @Component
75   struct Index {
76     @State message: string = 'Hello World';
77     build() {
78       Row() {
79         Column() {
80           Text(this.message)
81             .fontSize(50)
82             .fontWeight(FontWeight.Bold)
83             .onClick(() => {
84               postMessageTest();
85             })
86         }
87         .width('100%')
88       }
89       .height('100%')
90     }
91   }
92   ```
93   <!-- @[respond_worker_instant_message](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/ArkTsConcurrent/ConcurrentThreadCommunication/InterThreadCommunicationScenario/entry/src/main/ets/managers/WorkerCommunicatesWithMainthread.ets) -->
94
95
96在示例代码中,Worker接收宿主线程的消息,并进行处理后将结果返回给宿主线程。实现了宿主线程与Worker之间的即时通信,使宿主线程能够方便地使用Worker的运行结果。
97