1e41f4b71Sopenharmony_ci# TaskPool简介 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci任务池(TaskPool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。具体接口信息及使用方法详情请见[TaskPool](../reference/apis-arkts/js-apis-taskpool.md)。 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ci## TaskPool运作机制 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ciTaskPool运作机制示意图 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ciTaskPool支持开发者在主线程封装任务抛给任务队列,系统选择合适的工作线程,进行任务的分发及执行,再将结果返回给主线程。接口直观易用,支持任务的执行、取消,以及指定优先级的能力,同时通过系统统一线程管理,结合动态调度及负载均衡算法,可以节约系统资源。系统默认会启动一个任务工作线程,当任务较多时会扩容,工作线程数量上限跟当前设备的物理核数相关,具体数量内部管理,保证最优的调度及执行效率,长时间没有任务分发时会缩容,减少工作线程数量。 12e41f4b71Sopenharmony_ci 13e41f4b71Sopenharmony_ci## TaskPool注意事项 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ci- 实现任务的函数需要使用[@Concurrent装饰器](#concurrent装饰器)标注,且仅支持在.ets文件中使用。 16e41f4b71Sopenharmony_ci 17e41f4b71Sopenharmony_ci- 从API version 11开始,跨并发实例传递带方法的实例对象时,该类必须使用装饰器[@Sendable装饰器](sendable-overview.md#sendable装饰器)标注,且仅支持在.ets文件中使用。 18e41f4b71Sopenharmony_ci 19e41f4b71Sopenharmony_ci- 任务函数在TaskPool工作线程的执行耗时不能超过3分钟(不包含Promise和async/await异步调用的耗时,例如网络下载、文件读写等I/O任务的耗时),否则会被强制退出。 20e41f4b71Sopenharmony_ci 21e41f4b71Sopenharmony_ci- 实现任务的函数入参需满足序列化支持的类型,详情请参见[线程间通信对象](interthread-communication-overview.md)。 22e41f4b71Sopenharmony_ci 23e41f4b71Sopenharmony_ci- ArrayBuffer参数在TaskPool中默认转移,需要设置转移列表的话可通过接口[setTransferList()](../reference/apis-arkts/js-apis-taskpool.md#settransferlist10)设置。 24e41f4b71Sopenharmony_ci 25e41f4b71Sopenharmony_ci- 由于不同线程中上下文对象是不同的,因此TaskPool工作线程只能使用线程安全的库,例如UI相关的非线程安全库不能使用。 26e41f4b71Sopenharmony_ci 27e41f4b71Sopenharmony_ci- 序列化传输的数据量大小限制为16MB。 28e41f4b71Sopenharmony_ci 29e41f4b71Sopenharmony_ci- [Priority](../reference/apis-arkts/js-apis-taskpool.md#priority)的IDLE优先级是用来标记需要在后台运行的耗时任务(例如数据同步、备份),它的优先级别是最低的。这种优先级标记的任务只会在所有线程都空闲的情况下触发执行,并且只会占用一个线程来执行。 30e41f4b71Sopenharmony_ci 31e41f4b71Sopenharmony_ci- Promise不支持跨线程传递,如果TaskPool返回pending或rejected状态的Promise,会返回失败;对于fulfilled状态的Promise,TaskPool会解析返回的结果,如果结果可以跨线程传递,则返回成功。 32e41f4b71Sopenharmony_ci 33e41f4b71Sopenharmony_ci- 不支持在TaskPool工作线程中使用[AppStorage](../quick-start/arkts-appstorage.md)。 34e41f4b71Sopenharmony_ci 35e41f4b71Sopenharmony_ci## \@Concurrent装饰器 36e41f4b71Sopenharmony_ci 37e41f4b71Sopenharmony_ci在使用[TaskPool](zh-cn_topic_0000001936203798.xml)时,执行的并发函数需要使用该装饰器修饰,否则无法通过相关校验。 38e41f4b71Sopenharmony_ci 39e41f4b71Sopenharmony_ci> **说明:** 40e41f4b71Sopenharmony_ci> 41e41f4b71Sopenharmony_ci> 从API version 9开始,支持使用\@Concurrent装饰器声明并校验并发函数。 42e41f4b71Sopenharmony_ci 43e41f4b71Sopenharmony_ci### 装饰器说明 44e41f4b71Sopenharmony_ci 45e41f4b71Sopenharmony_ci| \@Concurrent并发装饰器 | 说明 | 46e41f4b71Sopenharmony_ci| -------- | -------- | 47e41f4b71Sopenharmony_ci| 装饰器参数 | 无。 | 48e41f4b71Sopenharmony_ci| 使用场景 | 仅支持在Stage模型的工程中使用。仅支持在.ets文件中使用。 | 49e41f4b71Sopenharmony_ci| 装饰的函数类型 | 允许标注async函数或普通函数。禁止标注generator、箭头函数、method。不支持类成员函数或者匿名函数。 | 50e41f4b71Sopenharmony_ci| 装饰的函数内的变量类型 | 允许使用local变量、入参和通过import引入的变量。禁止使用闭包变量。 | 51e41f4b71Sopenharmony_ci| 装饰的函数内的返回值类型 | 支持的类型请查[线程间通信对象](interthread-communication-overview.md)。 | 52e41f4b71Sopenharmony_ci 53e41f4b71Sopenharmony_ci> **说明:** 54e41f4b71Sopenharmony_ci> 55e41f4b71Sopenharmony_ci> 由于\@Concurrent标记的函数不能访问闭包,因此\@Concurrent标记的函数内部不能调用当前文件的其他函数,例如: 56e41f4b71Sopenharmony_ci> 57e41f4b71Sopenharmony_ci> ```ts 58e41f4b71Sopenharmony_ci> function bar() { 59e41f4b71Sopenharmony_ci> } 60e41f4b71Sopenharmony_ci> 61e41f4b71Sopenharmony_ci> @Concurrent 62e41f4b71Sopenharmony_ci> function foo() { 63e41f4b71Sopenharmony_ci> bar(); // 违反闭包原则,报错 64e41f4b71Sopenharmony_ci> } 65e41f4b71Sopenharmony_ci> ``` 66e41f4b71Sopenharmony_ci 67e41f4b71Sopenharmony_ci### 装饰器使用示例 68e41f4b71Sopenharmony_ci 69e41f4b71Sopenharmony_ci#### 并发函数一般使用 70e41f4b71Sopenharmony_ci 71e41f4b71Sopenharmony_ci并发函数为一个计算两数之和的普通函数,taskpool执行该函数并返回结果。 72e41f4b71Sopenharmony_ci 73e41f4b71Sopenharmony_ci示例: 74e41f4b71Sopenharmony_ci 75e41f4b71Sopenharmony_ci```ts 76e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS'; 77e41f4b71Sopenharmony_ci 78e41f4b71Sopenharmony_ci@Concurrent 79e41f4b71Sopenharmony_cifunction add(num1: number, num2: number): number { 80e41f4b71Sopenharmony_ci return num1 + num2; 81e41f4b71Sopenharmony_ci} 82e41f4b71Sopenharmony_ci 83e41f4b71Sopenharmony_ciasync function ConcurrentFunc(): Promise<void> { 84e41f4b71Sopenharmony_ci try { 85e41f4b71Sopenharmony_ci let task: taskpool.Task = new taskpool.Task(add, 1, 2); 86e41f4b71Sopenharmony_ci console.info("taskpool res is: " + await taskpool.execute(task)); 87e41f4b71Sopenharmony_ci } catch (e) { 88e41f4b71Sopenharmony_ci console.error("taskpool execute error is: " + e); 89e41f4b71Sopenharmony_ci } 90e41f4b71Sopenharmony_ci} 91e41f4b71Sopenharmony_ci 92e41f4b71Sopenharmony_ci@Entry 93e41f4b71Sopenharmony_ci@Component 94e41f4b71Sopenharmony_cistruct Index { 95e41f4b71Sopenharmony_ci @State message: string = 'Hello World' 96e41f4b71Sopenharmony_ci 97e41f4b71Sopenharmony_ci build() { 98e41f4b71Sopenharmony_ci Row() { 99e41f4b71Sopenharmony_ci Column() { 100e41f4b71Sopenharmony_ci Text(this.message) 101e41f4b71Sopenharmony_ci .fontSize(50) 102e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 103e41f4b71Sopenharmony_ci .onClick(() => { 104e41f4b71Sopenharmony_ci ConcurrentFunc(); 105e41f4b71Sopenharmony_ci }) 106e41f4b71Sopenharmony_ci } 107e41f4b71Sopenharmony_ci .width('100%') 108e41f4b71Sopenharmony_ci } 109e41f4b71Sopenharmony_ci .height('100%') 110e41f4b71Sopenharmony_ci } 111e41f4b71Sopenharmony_ci} 112e41f4b71Sopenharmony_ci``` 113e41f4b71Sopenharmony_ci 114e41f4b71Sopenharmony_ci#### 并发函数返回Promise 115e41f4b71Sopenharmony_ci 116e41f4b71Sopenharmony_ci并发函数中返回Promise的表现需关注,其中并发同步函数会处理返回该Promise并返回结果,如下例所示。 117e41f4b71Sopenharmony_ci 118e41f4b71Sopenharmony_ci示例: 119e41f4b71Sopenharmony_ci 120e41f4b71Sopenharmony_ci```ts 121e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS'; 122e41f4b71Sopenharmony_ci 123e41f4b71Sopenharmony_ci@Concurrent 124e41f4b71Sopenharmony_cifunction testPromise(args1: number, args2: number): Promise<number> { 125e41f4b71Sopenharmony_ci return new Promise<number>((testFuncA, testFuncB)=>{ 126e41f4b71Sopenharmony_ci testFuncA(args1 + args2); 127e41f4b71Sopenharmony_ci }); 128e41f4b71Sopenharmony_ci} 129e41f4b71Sopenharmony_ci 130e41f4b71Sopenharmony_ci@Concurrent 131e41f4b71Sopenharmony_ciasync function testPromise1(args1: number, args2: number): Promise<number> { 132e41f4b71Sopenharmony_ci return new Promise<number>((testFuncA, testFuncB)=>{ 133e41f4b71Sopenharmony_ci testFuncA(args1 + args2); 134e41f4b71Sopenharmony_ci }); 135e41f4b71Sopenharmony_ci} 136e41f4b71Sopenharmony_ci 137e41f4b71Sopenharmony_ci@Concurrent 138e41f4b71Sopenharmony_ciasync function testPromise2(args1: number, args2: number): Promise<number> { 139e41f4b71Sopenharmony_ci return await new Promise<number>((testFuncA, testFuncB)=>{ 140e41f4b71Sopenharmony_ci testFuncA(args1 + args2) 141e41f4b71Sopenharmony_ci }); 142e41f4b71Sopenharmony_ci} 143e41f4b71Sopenharmony_ci 144e41f4b71Sopenharmony_ci@Concurrent 145e41f4b71Sopenharmony_cifunction testPromise3() { 146e41f4b71Sopenharmony_ci return Promise.resolve(1); 147e41f4b71Sopenharmony_ci} 148e41f4b71Sopenharmony_ci 149e41f4b71Sopenharmony_ci@Concurrent 150e41f4b71Sopenharmony_ciasync function testPromise4(): Promise<number> { 151e41f4b71Sopenharmony_ci return 1; 152e41f4b71Sopenharmony_ci} 153e41f4b71Sopenharmony_ci 154e41f4b71Sopenharmony_ci@Concurrent 155e41f4b71Sopenharmony_ciasync function testPromise5(): Promise<string> { 156e41f4b71Sopenharmony_ci return await new Promise((resolve) => { 157e41f4b71Sopenharmony_ci setTimeout(()=>{ 158e41f4b71Sopenharmony_ci resolve("Promise setTimeout after resolve"); 159e41f4b71Sopenharmony_ci }, 1000) 160e41f4b71Sopenharmony_ci }); 161e41f4b71Sopenharmony_ci} 162e41f4b71Sopenharmony_ci 163e41f4b71Sopenharmony_ciasync function testConcurrentFunc() { 164e41f4b71Sopenharmony_ci let task1: taskpool.Task = new taskpool.Task(testPromise, 1, 2); 165e41f4b71Sopenharmony_ci let task2: taskpool.Task = new taskpool.Task(testPromise1, 1, 2); 166e41f4b71Sopenharmony_ci let task3: taskpool.Task = new taskpool.Task(testPromise2, 1, 2); 167e41f4b71Sopenharmony_ci let task4: taskpool.Task = new taskpool.Task(testPromise3); 168e41f4b71Sopenharmony_ci let task5: taskpool.Task = new taskpool.Task(testPromise4); 169e41f4b71Sopenharmony_ci let task6: taskpool.Task = new taskpool.Task(testPromise5); 170e41f4b71Sopenharmony_ci 171e41f4b71Sopenharmony_ci taskpool.execute(task1).then((d:object)=>{ 172e41f4b71Sopenharmony_ci console.info("task1 res is: " + d) 173e41f4b71Sopenharmony_ci }).catch((e:object)=>{ 174e41f4b71Sopenharmony_ci console.info("task1 catch e: " + e) 175e41f4b71Sopenharmony_ci }) 176e41f4b71Sopenharmony_ci taskpool.execute(task2).then((d:object)=>{ 177e41f4b71Sopenharmony_ci console.info("task2 res is: " + d) 178e41f4b71Sopenharmony_ci }).catch((e:object)=>{ 179e41f4b71Sopenharmony_ci console.info("task2 catch e: " + e) 180e41f4b71Sopenharmony_ci }) 181e41f4b71Sopenharmony_ci taskpool.execute(task3).then((d:object)=>{ 182e41f4b71Sopenharmony_ci console.info("task3 res is: " + d) 183e41f4b71Sopenharmony_ci }).catch((e:object)=>{ 184e41f4b71Sopenharmony_ci console.info("task3 catch e: " + e) 185e41f4b71Sopenharmony_ci }) 186e41f4b71Sopenharmony_ci taskpool.execute(task4).then((d:object)=>{ 187e41f4b71Sopenharmony_ci console.info("task4 res is: " + d) 188e41f4b71Sopenharmony_ci }).catch((e:object)=>{ 189e41f4b71Sopenharmony_ci console.info("task4 catch e: " + e) 190e41f4b71Sopenharmony_ci }) 191e41f4b71Sopenharmony_ci taskpool.execute(task5).then((d:object)=>{ 192e41f4b71Sopenharmony_ci console.info("task5 res is: " + d) 193e41f4b71Sopenharmony_ci }).catch((e:object)=>{ 194e41f4b71Sopenharmony_ci console.info("task5 catch e: " + e) 195e41f4b71Sopenharmony_ci }) 196e41f4b71Sopenharmony_ci taskpool.execute(task6).then((d:object)=>{ 197e41f4b71Sopenharmony_ci console.info("task6 res is: " + d) 198e41f4b71Sopenharmony_ci }).catch((e:object)=>{ 199e41f4b71Sopenharmony_ci console.info("task6 catch e: " + e) 200e41f4b71Sopenharmony_ci }) 201e41f4b71Sopenharmony_ci} 202e41f4b71Sopenharmony_ci 203e41f4b71Sopenharmony_ci@Entry 204e41f4b71Sopenharmony_ci@Component 205e41f4b71Sopenharmony_cistruct Index { 206e41f4b71Sopenharmony_ci @State message: string = 'Hello World'; 207e41f4b71Sopenharmony_ci 208e41f4b71Sopenharmony_ci build() { 209e41f4b71Sopenharmony_ci Row() { 210e41f4b71Sopenharmony_ci Column() { 211e41f4b71Sopenharmony_ci Button(this.message) 212e41f4b71Sopenharmony_ci .fontSize(50) 213e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 214e41f4b71Sopenharmony_ci .onClick(() => { 215e41f4b71Sopenharmony_ci testConcurrentFunc(); 216e41f4b71Sopenharmony_ci }) 217e41f4b71Sopenharmony_ci } 218e41f4b71Sopenharmony_ci .width('100%') 219e41f4b71Sopenharmony_ci } 220e41f4b71Sopenharmony_ci .height('100%') 221e41f4b71Sopenharmony_ci } 222e41f4b71Sopenharmony_ci} 223e41f4b71Sopenharmony_ci``` 224e41f4b71Sopenharmony_ci 225e41f4b71Sopenharmony_ci#### 并发函数中使用自定义类或函数 226e41f4b71Sopenharmony_ci 227e41f4b71Sopenharmony_ci并发函数中使用自定义类或函数时需定义在不同文件,否则会被认为是闭包,如下例所示。 228e41f4b71Sopenharmony_ci 229e41f4b71Sopenharmony_ci示例: 230e41f4b71Sopenharmony_ci 231e41f4b71Sopenharmony_ci```ts 232e41f4b71Sopenharmony_ci// Index.ets 233e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS'; 234e41f4b71Sopenharmony_ciimport { BusinessError } from '@kit.BasicServicesKit'; 235e41f4b71Sopenharmony_ciimport { testAdd, MyTestA, MyTestB } from './Test'; 236e41f4b71Sopenharmony_ci 237e41f4b71Sopenharmony_cifunction add(arg: number) { 238e41f4b71Sopenharmony_ci return ++arg; 239e41f4b71Sopenharmony_ci} 240e41f4b71Sopenharmony_ci 241e41f4b71Sopenharmony_ciclass TestA { 242e41f4b71Sopenharmony_ci constructor(name: string) { 243e41f4b71Sopenharmony_ci this.name = name; 244e41f4b71Sopenharmony_ci } 245e41f4b71Sopenharmony_ci name: string = 'ClassA'; 246e41f4b71Sopenharmony_ci} 247e41f4b71Sopenharmony_ci 248e41f4b71Sopenharmony_ciclass TestB { 249e41f4b71Sopenharmony_ci static nameStr: string = 'ClassB'; 250e41f4b71Sopenharmony_ci} 251e41f4b71Sopenharmony_ci 252e41f4b71Sopenharmony_ci@Concurrent 253e41f4b71Sopenharmony_cifunction TestFunc() { 254e41f4b71Sopenharmony_ci // case1:在并发函数中直接调用同文件内定义的类或函数 255e41f4b71Sopenharmony_ci 256e41f4b71Sopenharmony_ci // 直接调用同文件定义的函数add(),add飘红报错:Only imported variables and local variables can be used in @Concurrent decorated functions. <ArkTSCheck> 257e41f4b71Sopenharmony_ci // add(1); 258e41f4b71Sopenharmony_ci // 直接使用同文件定义的TestA构造,TestA飘红报错:Only imported variables and local variables can be used in @Concurrent decorated functions. <ArkTSCheck> 259e41f4b71Sopenharmony_ci // let a = new TestA("aaa"); 260e41f4b71Sopenharmony_ci // 直接访问同文件定义的TestB的成员nameStr,TestB飘红报错:Only imported variables and local variables can be used in @Concurrent decorated functions. <ArkTSCheck> 261e41f4b71Sopenharmony_ci // console.info("TestB name is: " + TestB.nameStr); 262e41f4b71Sopenharmony_ci 263e41f4b71Sopenharmony_ci // case2:在并发函数中调用定义在Test.ets文件并导入当前文件的类或函数 264e41f4b71Sopenharmony_ci 265e41f4b71Sopenharmony_ci // 输出结果:res1 is: 2 266e41f4b71Sopenharmony_ci console.info("res1 is: " + testAdd(1)); 267e41f4b71Sopenharmony_ci let tmpStr = new MyTestA("TEST A"); 268e41f4b71Sopenharmony_ci // 输出结果:res2 is: TEST A 269e41f4b71Sopenharmony_ci console.info("res2 is: " + tmpStr.name); 270e41f4b71Sopenharmony_ci // 输出结果:res3 is: MyTestB 271e41f4b71Sopenharmony_ci console.info("res3 is: " + MyTestB.nameStr); 272e41f4b71Sopenharmony_ci} 273e41f4b71Sopenharmony_ci 274e41f4b71Sopenharmony_ci 275e41f4b71Sopenharmony_ci@Entry 276e41f4b71Sopenharmony_ci@Component 277e41f4b71Sopenharmony_cistruct Index { 278e41f4b71Sopenharmony_ci @State message: string = 'Hello World'; 279e41f4b71Sopenharmony_ci 280e41f4b71Sopenharmony_ci build() { 281e41f4b71Sopenharmony_ci RelativeContainer() { 282e41f4b71Sopenharmony_ci Text(this.message) 283e41f4b71Sopenharmony_ci .id('HelloWorld') 284e41f4b71Sopenharmony_ci .fontSize(50) 285e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 286e41f4b71Sopenharmony_ci .alignRules({ 287e41f4b71Sopenharmony_ci center: { anchor: '__container__', align: VerticalAlign.Center }, 288e41f4b71Sopenharmony_ci middle: { anchor: '__container__', align: HorizontalAlign.Center } 289e41f4b71Sopenharmony_ci }) 290e41f4b71Sopenharmony_ci .onClick(() => { 291e41f4b71Sopenharmony_ci let task = new taskpool.Task(TestFunc); 292e41f4b71Sopenharmony_ci taskpool.execute(task).then(() => { 293e41f4b71Sopenharmony_ci console.info("taskpool: execute task success!"); 294e41f4b71Sopenharmony_ci }).catch((e:BusinessError) => { 295e41f4b71Sopenharmony_ci console.error(`taskpool: execute: Code: ${e.code}, message: ${e.message}`); 296e41f4b71Sopenharmony_ci }) 297e41f4b71Sopenharmony_ci }) 298e41f4b71Sopenharmony_ci } 299e41f4b71Sopenharmony_ci .height('100%') 300e41f4b71Sopenharmony_ci .width('100%') 301e41f4b71Sopenharmony_ci } 302e41f4b71Sopenharmony_ci} 303e41f4b71Sopenharmony_ci``` 304e41f4b71Sopenharmony_ci 305e41f4b71Sopenharmony_ci```ts 306e41f4b71Sopenharmony_ci// Test.ets 307e41f4b71Sopenharmony_ciexport function testAdd(arg: number) { 308e41f4b71Sopenharmony_ci return ++arg; 309e41f4b71Sopenharmony_ci} 310e41f4b71Sopenharmony_ci 311e41f4b71Sopenharmony_ci@Sendable 312e41f4b71Sopenharmony_ciexport class MyTestA { 313e41f4b71Sopenharmony_ci constructor(name: string) { 314e41f4b71Sopenharmony_ci this.name = name; 315e41f4b71Sopenharmony_ci } 316e41f4b71Sopenharmony_ci name: string = 'MyTestA'; 317e41f4b71Sopenharmony_ci} 318e41f4b71Sopenharmony_ci 319e41f4b71Sopenharmony_ciexport class MyTestB { 320e41f4b71Sopenharmony_ci static nameStr:string = 'MyTestB'; 321e41f4b71Sopenharmony_ci} 322e41f4b71Sopenharmony_ci``` 323e41f4b71Sopenharmony_ci 324e41f4b71Sopenharmony_ci#### 并发异步函数中使用Promise 325e41f4b71Sopenharmony_ci 326e41f4b71Sopenharmony_ci并发异步函数中如果使用Promise,建议搭配await使用捕获Promise中可能发生的异常。推荐使用示例如下。 327e41f4b71Sopenharmony_ci 328e41f4b71Sopenharmony_ci示例: 329e41f4b71Sopenharmony_ci 330e41f4b71Sopenharmony_ci```ts 331e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS' 332e41f4b71Sopenharmony_ci 333e41f4b71Sopenharmony_ci@Concurrent 334e41f4b71Sopenharmony_ciasync function testPromiseError() { 335e41f4b71Sopenharmony_ci await new Promise<number>((resolve, reject) => { 336e41f4b71Sopenharmony_ci resolve(1); 337e41f4b71Sopenharmony_ci }).then(()=>{ 338e41f4b71Sopenharmony_ci throw new Error("testPromise Error"); 339e41f4b71Sopenharmony_ci }) 340e41f4b71Sopenharmony_ci} 341e41f4b71Sopenharmony_ci 342e41f4b71Sopenharmony_ci@Concurrent 343e41f4b71Sopenharmony_ciasync function testPromiseError1() { 344e41f4b71Sopenharmony_ci await new Promise<string>((resolve, reject) => { 345e41f4b71Sopenharmony_ci reject("testPromiseError1 Error msg"); 346e41f4b71Sopenharmony_ci }) 347e41f4b71Sopenharmony_ci} 348e41f4b71Sopenharmony_ci 349e41f4b71Sopenharmony_ci@Concurrent 350e41f4b71Sopenharmony_cifunction testPromiseError2() { 351e41f4b71Sopenharmony_ci return new Promise<string>((resolve, reject) => { 352e41f4b71Sopenharmony_ci reject("testPromiseError2 Error msg"); 353e41f4b71Sopenharmony_ci }) 354e41f4b71Sopenharmony_ci} 355e41f4b71Sopenharmony_ci 356e41f4b71Sopenharmony_ciasync function testConcurrentFunc() { 357e41f4b71Sopenharmony_ci let task1: taskpool.Task = new taskpool.Task(testPromiseError); 358e41f4b71Sopenharmony_ci let task2: taskpool.Task = new taskpool.Task(testPromiseError1); 359e41f4b71Sopenharmony_ci let task3: taskpool.Task = new taskpool.Task(testPromiseError2); 360e41f4b71Sopenharmony_ci 361e41f4b71Sopenharmony_ci taskpool.execute(task1).then((d:object)=>{ 362e41f4b71Sopenharmony_ci console.info("task1 res is: " + d) 363e41f4b71Sopenharmony_ci }).catch((e:object)=>{ 364e41f4b71Sopenharmony_ci console.info("task1 catch e: " + e) 365e41f4b71Sopenharmony_ci }) 366e41f4b71Sopenharmony_ci taskpool.execute(task2).then((d:object)=>{ 367e41f4b71Sopenharmony_ci console.info("task2 res is: " + d) 368e41f4b71Sopenharmony_ci }).catch((e:object)=>{ 369e41f4b71Sopenharmony_ci console.info("task2 catch e: " + e) 370e41f4b71Sopenharmony_ci }) 371e41f4b71Sopenharmony_ci taskpool.execute(task3).then((d:object)=>{ 372e41f4b71Sopenharmony_ci console.info("task3 res is: " + d) 373e41f4b71Sopenharmony_ci }).catch((e:object)=>{ 374e41f4b71Sopenharmony_ci console.info("task3 catch e: " + e) 375e41f4b71Sopenharmony_ci }) 376e41f4b71Sopenharmony_ci} 377e41f4b71Sopenharmony_ci 378e41f4b71Sopenharmony_ci@Entry 379e41f4b71Sopenharmony_ci@Component 380e41f4b71Sopenharmony_cistruct Index { 381e41f4b71Sopenharmony_ci @State message: string = 'Hello World'; 382e41f4b71Sopenharmony_ci 383e41f4b71Sopenharmony_ci build() { 384e41f4b71Sopenharmony_ci Row() { 385e41f4b71Sopenharmony_ci Column() { 386e41f4b71Sopenharmony_ci Button(this.message) 387e41f4b71Sopenharmony_ci .fontSize(50) 388e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 389e41f4b71Sopenharmony_ci .onClick(() => { 390e41f4b71Sopenharmony_ci testConcurrentFunc(); 391e41f4b71Sopenharmony_ci }) 392e41f4b71Sopenharmony_ci } 393e41f4b71Sopenharmony_ci .width('100%') 394e41f4b71Sopenharmony_ci } 395e41f4b71Sopenharmony_ci .height('100%') 396e41f4b71Sopenharmony_ci } 397e41f4b71Sopenharmony_ci} 398e41f4b71Sopenharmony_ci``` 399