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