文章配图:taskpool 多线程并发

页面预览

前言

taskpool 是 HarmonyOS 的任务池并发能力,将任务提交到后台线程执行,不阻塞 UI 线程。在「猫猫大作战」中,taskpool 用于后台保存游戏数据加密战绩以及大量数据的排序处理

一、taskpool 基础

import { taskpool } from '@kit.ArkTS';

// 定义任务函数(必须使用 @Concurrent 装饰)
@Concurrent
function saveScoreToFile(score: number, path: string): boolean {
  // 在后台线程执行文件写入
  try {
    // ... 文件写入逻辑
    return true;
  } catch {
    return false;
  }
}

// 提交任务
async function saveScoreAsync(score: number): Promise<void> {
  const path = `${getContext().filesDir}/score.txt`;
  const result = await taskpool.execute(saveScoreToFile, score, path);
  console.info(`保存结果: ${result}`);
}

二、多任务并行

@Concurrent
function processMerge(cats: Cat[]): MergeResult {
  // 后台执行合并检测
  return detectMerges(cats);
}

@Concurrent
function updateScore(score: number): number {
  return score * 2;  // 模拟复杂计算
}

// 并行执行多个任务
async function parallelTasks() {
  const [mergeResult, newScore] = await Promise.all([
    taskpool.execute(processMerge, this.cats),
    taskpool.execute(updateScore, this.score),
  ]);
  console.info(`合并结果: ${mergeResult}, 得分: ${newScore}`);
}

三、taskpool vs Worker

特性 taskpool Worker
创建方式 动态提交 预创建
资源管理 自动管理 手动管理
数据传递 结构化克隆 结构化克隆
适用场景 频繁小任务 长耗时大任务
复杂度

四、游戏中的应用

// 游戏结束时异步保存
endGame() {
  // 1. 先切换 UI
  this.gameState = GameState.GAME_OVER;

  // 2. 后台保存
  taskpool.execute(saveGameData, {
    score: this.score,
    cats: this.gameEngine.getAllCats(),
    timestamp: Date.now(),
  });

  // 3. 同时异步加密
  taskpool.execute(encryptScore, this.score);
}

五、限制说明

  1. 任务函数必须 @Concurrent 装饰
  2. 参数必须是结构化克隆兼容类型(不能传函数、Class 实例)
  3. 不可访问 UI 线程的变量(如 getContext()
  4. 避免长时间任务(单任务建议 < 3 秒)

总结

taskpool 提供简单高效的后台并发能力,适合游戏中的异步数据保存和计算。核心要点:@Concurrent 标记任务函数、 taskpool.execute 提交执行、 多任务 Promise.all 并行、 不阻塞 UI 线程

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐