1# 使用TaskPool执行多个耗时任务 2 3如果有多个任务同时执行,由于任务的复杂度不同,执行时间会不一样,返回数据的时间也是不可控的。如果宿主线程需要所有任务执行完毕的数据,那么可以通过下面这种方式实现。 4 5除此以外,如果需要处理的数据量较大(比如一个列表中有10000条数据),把这些数据都放在一个Task中处理也是比较耗时的。那么就可以将原始数据拆分成多个列表,并将每个子列表分配给一个独立的Task进行执行,并且等待全部执行完毕后拼成完整的数据,这样可以节省处理时间,提升用户体验。 6 7下面以多个任务进行图片加载为例进行说明。 8 91. 实现子线程需要执行的任务。 10 11 ```ts 12 // IconItemSource.ets 13 export class IconItemSource { 14 image: string | Resource = ''; 15 text: string | Resource = ''; 16 17 constructor(image: string | Resource = '', text: string | Resource = '') { 18 this.image = image; 19 this.text = text; 20 } 21 } 22 ``` 23 24 ```ts 25 // IndependentTask.ets 26 import { IconItemSource } from './IconItemSource'; 27 28 // 在Task中执行的方法,需要添加@Concurrent注解,否则无法正常调用。 29 @Concurrent 30 export function loadPicture(count: number): IconItemSource[] { 31 let iconItemSourceList: IconItemSource[] = []; 32 // 遍历添加6*count个IconItem的数据 33 for (let index = 0; index < count; index++) { 34 const numStart: number = index * 6; 35 // 此处循环使用6张图片资源 36 iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 1}`)); 37 iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 2}`)); 38 iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 3}`)); 39 iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 4}`)); 40 iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 5}`)); 41 iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 6}`)); 42 43 } 44 return iconItemSourceList; 45 } 46 ``` 47 482. 将需要执行的Task放到了一个TaskGroup里面,当TaskGroup中所有的Task都执行完毕后,会把每个Task运行的结果都放在一个数组中返回到宿主线程,而不是每执行完一个Task就返回一次,这样就可以在返回的数据里拿到所有的Task执行结果,方便宿主线程使用。 49 50 ```ts 51 // MultiTask.ets 52 import { taskpool } from '@kit.ArkTS'; 53 import { IconItemSource } from './IconItemSource'; 54 import { loadPicture } from './IndependentTask'; 55 56 let iconItemSourceList: IconItemSource[][]; 57 58 let taskGroup: taskpool.TaskGroup = new taskpool.TaskGroup(); 59 taskGroup.addTask(new taskpool.Task(loadPicture, 30)); 60 taskGroup.addTask(new taskpool.Task(loadPicture, 20)); 61 taskGroup.addTask(new taskpool.Task(loadPicture, 10)); 62 taskpool.execute(taskGroup).then((ret: object) => { 63 let tmpLength = (ret as IconItemSource[][]).length 64 for (let i = 0; i < tmpLength; i++) { 65 for (let j = 0; j < ret[i].length; j++) { 66 iconItemSourceList.push(ret[i][j]); 67 } 68 } 69 }) 70 ``` 71