1e41f4b71Sopenharmony_ci# TaskPool任务与主线程通信
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci如果一个Task,不仅需要返回最后的执行结果,而且需要定时通知主线程状态、数据的变化,或者需要分段返回数量级较大的数据(比如从数据库中读取大量数据),可以通过下面这种方式实现。
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci下面以多个图片加载任务结果实时返回为例进行说明。
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci1. 首先,实现一个方法,用来接收Task发送的消息。
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci   ```ts
10e41f4b71Sopenharmony_ci   // TaskSendDataUsage.ets
11e41f4b71Sopenharmony_ci   function notice(data: number): void {
12e41f4b71Sopenharmony_ci     console.info("子线程任务已执行完,共加载图片: ", data);
13e41f4b71Sopenharmony_ci   }
14e41f4b71Sopenharmony_ci   ```
15e41f4b71Sopenharmony_ci
16e41f4b71Sopenharmony_ci2. 然后,在Task需要执行的任务中,添加sendData()接口将消息发送给主线程。
17e41f4b71Sopenharmony_ci
18e41f4b71Sopenharmony_ci   ```ts
19e41f4b71Sopenharmony_ci   // IconItemSource.ets
20e41f4b71Sopenharmony_ci   export class IconItemSource {
21e41f4b71Sopenharmony_ci     image: string | Resource = '';
22e41f4b71Sopenharmony_ci     text: string | Resource = '';
23e41f4b71Sopenharmony_ci   
24e41f4b71Sopenharmony_ci     constructor(image: string | Resource = '', text: string | Resource = '') {
25e41f4b71Sopenharmony_ci       this.image = image;
26e41f4b71Sopenharmony_ci       this.text = text;
27e41f4b71Sopenharmony_ci     }
28e41f4b71Sopenharmony_ci   }
29e41f4b71Sopenharmony_ci   ```
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ci   ```ts
32e41f4b71Sopenharmony_ci   // TaskSendDataUsage.ets
33e41f4b71Sopenharmony_ci   import { taskpool } from '@kit.ArkTS';
34e41f4b71Sopenharmony_ci   import { IconItemSource } from './IconItemSource';
35e41f4b71Sopenharmony_ci   
36e41f4b71Sopenharmony_ci   // 通过Task的sendData方法,即时通知主线程信息
37e41f4b71Sopenharmony_ci   @Concurrent
38e41f4b71Sopenharmony_ci   export function loadPictureSendData(count: number): IconItemSource[] {
39e41f4b71Sopenharmony_ci     let iconItemSourceList: IconItemSource[] = [];
40e41f4b71Sopenharmony_ci     // 遍历添加6*count个IconItem的数据
41e41f4b71Sopenharmony_ci     for (let index = 0; index < count; index++) {
42e41f4b71Sopenharmony_ci       const numStart: number = index * 6;
43e41f4b71Sopenharmony_ci       // 此处循环使用6张图片资源
44e41f4b71Sopenharmony_ci       iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 1}`));
45e41f4b71Sopenharmony_ci       iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 2}`));
46e41f4b71Sopenharmony_ci       iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 3}`));
47e41f4b71Sopenharmony_ci       iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 4}`));
48e41f4b71Sopenharmony_ci       iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 5}`));
49e41f4b71Sopenharmony_ci       iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 6}`));
50e41f4b71Sopenharmony_ci   
51e41f4b71Sopenharmony_ci       taskpool.Task.sendData(iconItemSourceList.length);
52e41f4b71Sopenharmony_ci     }
53e41f4b71Sopenharmony_ci     return iconItemSourceList;
54e41f4b71Sopenharmony_ci   }
55e41f4b71Sopenharmony_ci   ```
56e41f4b71Sopenharmony_ci
57e41f4b71Sopenharmony_ci3. 最后,在主线程通过onReceiveData()接口接收消息。
58e41f4b71Sopenharmony_ci   这样主线程就可以通过notice()接口接收到Task发送的数据。
59e41f4b71Sopenharmony_ci
60e41f4b71Sopenharmony_ci   ```ts
61e41f4b71Sopenharmony_ci   // TaskSendDataUsage.ets
62e41f4b71Sopenharmony_ci   @Entry
63e41f4b71Sopenharmony_ci   @Component
64e41f4b71Sopenharmony_ci   struct Index {
65e41f4b71Sopenharmony_ci     @State message: string = 'Hello World';
66e41f4b71Sopenharmony_ci   
67e41f4b71Sopenharmony_ci     build() {
68e41f4b71Sopenharmony_ci       Row() {
69e41f4b71Sopenharmony_ci         Column() {
70e41f4b71Sopenharmony_ci           Text(this.message)
71e41f4b71Sopenharmony_ci             .fontSize(50)
72e41f4b71Sopenharmony_ci             .fontWeight(FontWeight.Bold)
73e41f4b71Sopenharmony_ci             .onClick(() => {
74e41f4b71Sopenharmony_ci               let iconItemSourceList: IconItemSource[];
75e41f4b71Sopenharmony_ci               let lodePictureTask: taskpool.Task = new taskpool.Task(loadPictureSendData, 30);
76e41f4b71Sopenharmony_ci               // 设置notice方法接收Task发送的消息
77e41f4b71Sopenharmony_ci               lodePictureTask.onReceiveData(notice);
78e41f4b71Sopenharmony_ci               taskpool.execute(lodePictureTask).then((res: object) => {
79e41f4b71Sopenharmony_ci                 iconItemSourceList = res as IconItemSource[];
80e41f4b71Sopenharmony_ci               })
81e41f4b71Sopenharmony_ci             })
82e41f4b71Sopenharmony_ci         }
83e41f4b71Sopenharmony_ci         .width('100%')
84e41f4b71Sopenharmony_ci       }
85e41f4b71Sopenharmony_ci       .height('100%')
86e41f4b71Sopenharmony_ci     }
87e41f4b71Sopenharmony_ci   }
88e41f4b71Sopenharmony_ci   ```
89