鸿蒙HarmonyOS开发之TaskPool 使用指南

TaskPool 使用指南

场景应用

TaskPool 是一个用于任务调度和管理的工具,适用于以下场景:

  1. 优先级任务处理:如图像库直方图绘制,后台计算的直方图数据对前台界面显示至关重要,影响用户体验,需高优先级处理。
  2. 频繁取消的任务:在图库大图浏览中,为提升体验,会同时缓存当前图片左右侧各2张图片,滑动切换时需取消另一侧的缓存任务。
  3. 大量或分散的任务:大型应用的多个模块包含多个耗时任务,不便于使用固定数量的Worker进行负载管理。
  4. 耗时任务:适用于耗时不超过3分钟的任务。

基本使用

TaskPool 的基本使用包括创建任务、执行任务和取消任务。

// 使用@Concurrent并发装饰器注解并发方法
@Concurrent
function add(num1: number, num2: number): number {
  return num1 + num2;
}

// 创建任务
let task: taskpool.Task = new taskpool.Task(add, 1, 2);

async function ConcurrentFunc(): Promise<void> {
  try {
    // 执行任务
    let result = await taskpool.execute(task);
  } catch (e) {
    console.error("taskpool execute error is: " + e);
  }
}

// 取消任务执行
taskpool.cancel(task);

数据克隆

TaskPool 在执行任务时会对传入的数据进行克隆,确保异步方法内对数据的修改不会影响主线程的数据。

@Concurrent
function testFun(list: ShopItemData): ShopItemData {
  list.title = "并发后";
  return list;
}

// 在组件中使用TaskPool
@Entry
@Component
struct TaskPoolPage {
  testData: ShopItemData = new ShopItemData("", "", "", "");

  build() {
    Row() {
      Column() {
        Button("TaskPool调用").onClick(() => {
          this.testData.title = "并发前";
          this.concurrentFunc();
        });
      }
      .width('100%');
    }
    .height('100%');
  }

  async concurrentFunc() {
    let task: taskpool.Task = new taskpool.Task(testFun, this.testData);
    let result = await taskpool.execute(task) as ShopItemData;
    console.info("TaskPool返回的值为:" + result.title);
    console.info("this.testData的值为:" + this.testData.title);
  }
}

支持的数据类型

并发函数的参数和返回值仅支持特定的数据类型,详见官方文档

其他特性

  • 数据传输限制:序列化传输的数据量大小限制为16MB。
  • 任务回收:超长任务(大于3分钟)会被系统自动回收。
  • 负载均衡:TaskPool支持自动扩缩容,理论上可以创建数量不受限制的任务,但出于内存考虑,不建议创建过多任务。

TaskPool 是一个强大的任务调度工具,能够有效地管理并发任务,提升应用性能和用户体验。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿蒙开发助手

赏钱一扔,代码超神,事业飞腾

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值