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