1# 多线程取消TaskPool任务场景 2 3任务池[TaskPool](../reference/apis-arkts/js-apis-taskpool.md)的任务对象[Task](../reference/apis-arkts/js-apis-taskpool.md#task)在 API version 18 之前不支持传递到子线程,因此无法在子线程中取消任务。从 API version 18 开始,Task新增了[任务ID](../reference/apis-arkts/js-apis-taskpool.md#属性)属性,支持通过任务ID在子线程中取消任务。以下示例提供多线程取消已提交给TaskPool中的任务开发指导,开发者可将已创建任务的任务ID存储在[Sendable对象](./arkts-sendable.md)中,需要取消任务时,通过Sendable对象来多线程取消任务。 4 51. 定义一个Sendable类,在类属性中存储任务ID。 6 7 ```ts 8 // Mock.ets 9 10 @Sendable 11 export class SendableTest { 12 // 储存任务ID 13 private taskId: number = 0; 14 15 constructor(id: number) { 16 this.taskId = id; 17 } 18 19 public getTaskId(): number { 20 return this.taskId; 21 } 22 } 23 ``` 24 252. 在UI主线程向TaskPool提交一个延时任务,并在子线程取消该任务。 26 27 ```ts 28 // Index.ets 29 30 import { taskpool } from '@kit.ArkTS'; 31 import { SendableTest } from './Mock' 32 33 @Concurrent 34 function cancel(send: SendableTest) { 35 console.info("cancel task finished"); 36 // 通过任务ID多线程取消任务 37 taskpool.cancel(send.getTaskId()); 38 } 39 40 @Concurrent 41 function delayed() { 42 console.info("delayed task finished"); 43 } 44 45 @Entry 46 @Component 47 struct Index { 48 @State message: string = 'Hello World!'; 49 @State books: string[] = []; 50 51 build() { 52 Column({ space: 1 }) { 53 Button(this.books[3]) 54 .fontSize(20) 55 .padding(10) 56 .fontWeight(FontWeight.Bold) 57 .onClick(async () => { 58 let task = new taskpool.Task(delayed); 59 taskpool.executeDelayed(2000, task); 60 let send = new SendableTest(task.taskId); 61 taskpool.execute(cancel, send); 62 }) 63 } 64 .height('100%') 65 .width('100%') 66 } 67 } 68 ```