• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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   ```