• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}目录下任意位置,单击鼠标右键 &gt; New &gt; 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