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