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