Taskpool简单使用2

taskpool 传递参数;

在调用方法时传递多个值;代码如下:

typescript 复制代码
@Concurrent
function culSum(param1:number,param2:number){
  let sum = param1+param2
  console.log(`--------- > taskpool ${sum} .. param1 ${param1} .. params2 ${param2}` )
  return sum;
}


taskpool.execute(culSum, 10, 10).catch(() => {
})
  .then((result) => {
    console.log('--------- > taskpool result ' + result)
  })

执行结果代码:

lua 复制代码
 --------- > taskpool 20 .. param1 10 .. params2 10
 --------- > taskpool result 20

其实在taskpool.execute()方法针对参数的传递是不限制个数的;相应的参数代码如下:

javascript 复制代码
function execute(func: Function, ...args: Object[]): Promise<Object>;

args:参数有点类似于kotlin 方法中的 vararg,java 中的 String... ;

如何在@Concurrent 方法中调用其他方法:

在@Concurrent 方法中调用其他方法;在平时的开发中,如果在子线程执行任务,不可能就写一个方法直接将全部的业务都堆积到内部。因此我们可能根据设计模式的单一原则,将功能进行拆分成多个方法执行;但是在鸿蒙中@Concurrent 方法 是禁止使用闭包变量。

例如错误代码

scss 复制代码
function bar() {
}

@Concurrent
function foo() {
  bar(); // 违反闭包原则,报错
}

那么在开发中,可以通过在调用方法时传递进入一个共享对象,在该对象类中存在执行的逻辑;或者直接使用工具类调用其静态方法;代码如下:

typescript 复制代码
model:
@Sendable
export class StudentModel{
  public name:string = '小明'
  constructor( name: string) {
    this.name = name
  }
//执行的方法,在子线程中
  culSum(param:number,param2:number){
    return param +param2
  }
}

触发代码:

typescript 复制代码
 let student = new StudentModel( '小明')
  taskpool.execute(verifyEnum, student).catch(() => {
  }).then((result) => {
    console.error('--------- > taskpool '+JSON.stringify(result))
  })

 方法:
 @Concurrent
function verifyEnum(student: StudentModel) {
  console.error('--------- > taskpool ' + JSON.stringify(student))
  student.name = '小花'
  student.culSum(10,10)
  return student
}

同样也可以调用静态方法执行相关逻辑 如下:

typescript 复制代码
export class StudentUtil {
  private constructor() {
  }

  static culSum(param: number, param2: number) {
    return param + param2
  }
}

方法:
@Concurrent
function verifyEnum(student: StudentModel) {
 let sum =  student.culSum(10,10)
  let sum1 = StudentUtil.culSum(11,11)

  console.error(`--------- > taskpool sum ${sum}  sum1 ${sum1}`)

  return student
}

结果:

bash 复制代码
--------- > taskpool sum 20  sum1 22

遇见问题:

1.在使用taskpool 过程中,如果在接收方法上添加了 async 后,需要在taskpool.execute 方法添加await 否则也无法正常的拿到值;

2.在低版本中在自定义 bean类上添加了@Sendable 后,无法使用枚举类型;这个升级版本就可以了;

3.线程间数据传递,如果自定义 Bean 不添加@Sendable 是采用的序列化方式;因此在子线程中的对象调用对象类中的方法会失效;

如果描述中出现问题,请各位大佬不吝赐教;

相关推荐
风华圆舞2 分钟前
Flutter + 鸿蒙 Intents Kit:页面直达能力的完整接入方案
flutter·ui·华为·harmonyos
三声三视18 分钟前
Electron 在鸿蒙 PC 上跑 webview,我是怎么把首屏从 4.2s 干到 1.1s 的
华为·electron·harmonyos·鸿蒙
互联网散修2 小时前
鸿蒙实战:从0到1构建功能完备的搜索页面
华为·harmonyos
花椒技术2 小时前
RN 多包热更新实践:更新校验、运行时加载与 Bridge 缓存治理
react native·react.js·harmonyos
不喝水就会渴2 小时前
【共创季稿事节】HarmonyOS 7.0 时代的新基建 :DevEco CLI + Claude Code,鸿蒙 AI 开发的黄金搭档
人工智能·华为·harmonyos
星释2 小时前
鸿蒙智能体开发实战:2.创建单Agent
harmonyos·智能体
世人万千丶3 小时前
成语接龙小应用 - HarmonyOS ArkUI 开发实战-TextInput与List列表-PC版本
华为·list·harmonyos·鸿蒙·鸿蒙系统
TrisighT3 小时前
AI写鸿蒙UI:10个跑崩8个,剩下2个看运气
ai编程·harmonyos·arkts
伶俜663 小时前
鸿蒙原生应用实战(十八)ArkUI 记账本:SQLite 账单 + 图表统计 + 分类管理
jvm·sqlite·harmonyos
Davina_yu4 小时前
自定义弹窗:使用CustomDialogController实现复杂交互(27)
harmonyos·鸿蒙·鸿蒙系统