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