HarmonyOS 鸿蒙Next TaskPool执行任务的函数装饰器疑问:@Concurrent是否必需于类定义中

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next TaskPool执行任务的函数装饰器疑问:@Concurrent是否必需于类定义中

TaskPool的执行任务的函数要用@Concurrent装饰,若是将执行任务的函数放在某个类中定义,这时还需要这个装饰器吗?如图所示,这种写法会报错。

2 回复
从API version 11开始,实现任务的函数需要使用类方法时,该类必须使用装饰器[@Sendable](/user/Sendable)标注,且仅支持在.ets文件中使用。参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/taskpool-introduction-V5#taskpool注意事项

具体使用参考如下代码:

// sendable.ets

// 定义模拟类Test,模仿开发过程中需传递带方法的class

import { lang, collections  } from '@kit.ArkTS'
export type ISendable = lang.ISendable;
[@Sendable](/user/Sendable)
export class SendableTestClass {
  name: string = 'John';
  age: number = 20;
  sex: string = ""man"";
  arr: collections.Array<number> = new collections.Array<number>(1, 2, 3);
  constructor() {
  }
  setAge(age: number) : void {
    this.age = age;
  }
  printName(): string {
    return this.name;
  }
  printAge(): number {
    return this.age;
  }
  printSex(): string {
    return this.sex;
  }
}

// Index.ets

import { taskpool, ArkTSUtils } from '@kit.ArkTS'
import { SendableTestClass, ISendable } from './sendable'
// 在并发函数中模拟数据处理
[@Concurrent](/user/Concurrent)
async function taskFunc(sendableObj: SendableTestClass) {
  console.info(""SendableTestClass: name is: "" + sendableObj.printName() + "", age is: "" + sendableObj.printAge() + "", sex is: "" + sendableObj.printSex());
  sendableObj.setAge(28);
  console.info(""SendableTestClass: age is: "" + sendableObj.printAge());
  // 解析sendableObj.arr数据生成JSON字符串
  let str = ArkTSUtils.ASON.stringify(sendableObj.arr);
  console.info(""SendableTestClass: str is: "" + str);
  // 解析该数据并生成ISendable数据
  let jsonStr = '{""name"": ""Alexa"", ""age"": 23, ""sex"": ""female""}';
  let obj = ArkTSUtils.ASON.parse(jsonStr) as ISendable;
  console.info(""SendableTestClass: type is: "" + typeof obj);
  console.info(""SendableTestClass: name is: "" + (obj as object)?.[""name""]); // 输出: 'Alexa'
  console.info(""SendableTestClass: age is: "" + (obj as object)?.[""age""]); // 输出: 23
  console.info(""SendableTestClass: sex is: "" + (obj as object)?.[""sex""]); // 输出: 'female'
}
async function test() {
  // 使用taskpool传递数据
  let obj: SendableTestClass = new SendableTestClass();
  let task: taskpool.Task = new taskpool.Task(taskFunc, obj);
  await taskpool.execute(task);
}
test();

由于[@Concurrent](/user/Concurrent)装饰器不支持类成员函数或者匿名函数,所以不能在自定义类中使用

在HarmonyOS鸿蒙系统中,关于Next TaskPool执行任务时是否必须使用@Concurrent装饰器,这取决于具体的使用场景和需求。

@Concurrent装饰器主要用于标记一个方法是并发执行的,它通常与TaskPool配合使用,以确保方法能够在独立的线程或任务中运行。这对于提高程序的并发性和性能特别有用,特别是在处理I/O密集型或计算密集型任务时。

然而,@Concurrent并非必须在类定义中使用。它可以用于类的方法上,也可以用于独立的函数。关键在于理解你的任务是否需要并发执行。如果任务可以串行执行,或者你有其他方式管理并发(例如使用显式的线程或任务管理),那么@Concurrent就不是必需的。

不过,使用@Concurrent可以简化并发编程的复杂性,因为它允许开发者以声明性的方式指定并发行为,而无需手动管理线程或任务的生命周期。

总之,@Concurrent的使用取决于你的具体需求。如果你希望方法并发执行,并且希望利用HarmonyOS提供的TaskPool机制来简化并发编程,那么@Concurrent是一个很好的选择。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部