1# 常驻任务开发指导(Worker) 2 3此处提供使用Worker进行常驻任务的开发指导,Worker会持续执行任务直到宿主线程发出终止指令。 4 5开发过程和示例如下所示: 6 71. DevEco Studio支持一键生成Worker,在对应的{moduleName}目录下任意位置,点击鼠标右键 > New > Worker,即可自动生成Worker的模板文件及配置信息。本文以创建“Worker”为例。 8 9 此外,还支持手动创建Worker文件,具体方式和相关注意事项请见[创建Worker的注意事项](worker-introduction.md#创建worker的注意事项)。 10 112. 导入Worker模块。 12 13 ```ts 14 // Index.ets 15 import { worker } from '@kit.ArkTS'; 16 ``` 17 183. 在宿主线程中通过调用ThreadWorker的[constructor()](../reference/apis-arkts/js-apis-worker.md#constructor9)方法创建Worker对象,当前线程为宿主线程。 19 20 ```ts 21 // Index.ets 22 const workerInstance: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ets'); 23 ``` 24 254. 此处宿主线程为UI主线程,宿主线程发送'start',开始执行某个长期运行的任务并接收子线程返回的相关消息。在不需要执行该任务时发送'stop',停止该任务执行,该示例中10s后结束该任务。 26 27 ```ts 28 // Index.ets 29 30 @Entry 31 @Component 32 struct Index { 33 build() { 34 Column() { 35 Text("Listener task") 36 .id('HelloWorld') 37 .fontSize(50) 38 .fontWeight(FontWeight.Bold) 39 .onClick(() => { 40 workerInstance.postMessage({type: 'start'}) 41 workerInstance.onmessage = (event) => { 42 console.info('UI主线程收到消息:', event.data); 43 } 44 // 10秒后停止worker 45 setTimeout(() => { 46 workerInstance.postMessage({ type: 'stop' }); 47 }, 10000); 48 }) 49 } 50 .height('100%') 51 .width('100%') 52 } 53 } 54 ``` 55 565. 在Worker线程中当接受到宿主线程发送的消息为'start'时,开始执行某个长时间不定期运行的任务并实时返回消息给宿主线程。当接收到的消息为'stop'时结束该任务执行并返回相应消息给宿主线程。 57 58 ```ts 59 // Worker.ets 60 import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS'; 61 const workerPort: ThreadWorkerGlobalScope = worker.workerPort; 62 let isRunning = false; 63 workerPort.onmessage = (e: MessageEvents) => { 64 const type = e.data.type as string; 65 if (type === 'start') { 66 if (!isRunning) { 67 isRunning = true; 68 // 开始常驻任务 69 performTask(); 70 } 71 } else if (type === 'stop') { 72 isRunning = false; 73 workerPort.close(); // 关闭Worker 74 } 75 } 76 // 模拟常驻任务 77 function performTask() { 78 if (isRunning) { 79 // 模拟某个长期运行的任务 80 workerPort.postMessage('Worker is performing a task'); 81 // 1秒后再次执行任务 82 setTimeout(performTask, 1000); 83 } 84 workerPort.postMessage('Worker is stop performing a task'); 85 } 86 ``` 87