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