文章配图:Worker 独立线程

页面预览

前言

Worker 是 HarmonyOS 中用于创建独立线程的解决方案。与 taskpool 的动态提交不同,Worker 是一个常驻后台线程,适合长时间运行的密集型任务。

一、Worker 创建

// main.ets — 主线程
const worker = new Worker('entry/ets/workers/GameWorker.ets');

worker.onmessage = (event) => {
  console.info(`Worker 返回: ${event.data}`);
};

worker.postMessage({ type: 'compute', data: { score: 100, cats: [] } });

// GameWorker.ets — Worker 线程
import { WorkerPool, MessageEvents } from '@kit.ArkTS';

const workerPool = new WorkerPool();

workerPool.onmessage = (event) => {
  const { type, data } = event.data;
  if (type === 'compute') {
    // 耗时计算
    const result = heavyComputation(data);
    workerPool.postMessage(result);
  }
};

function heavyComputation(data: object): number {
  // 模拟耗时的游戏计算
  return 42;
}

二、Worker vs taskpool

特性 Worker taskpool
生命周期 常驻 临时
创建方式 独立文件 @Concurrent 函数
通信方式 postMessage 返回值
适用场景 持续运行 单次任务
复杂度 高(需要管理生命周期)

三、游戏中的应用

// 使用 Worker 做后台自动存档
class SaveWorker {
  private worker: Worker;

  constructor() {
    this.worker = new Worker('entry/ets/workers/SaveWorker.ets');
    this.worker.onmessage = (e) => {
      console.info(`保存结果: ${e.data}`);
    };
  }

  save(score: number, cats: Cat[]): void {
    this.worker.postMessage({
      type: 'save',
      data: { score, timestamp: Date.now() }
    });
  }

  destroy(): void {
    this.worker.terminate();
  }
}

四、限制

  1. 独立文件:Worker 代码必须放在独立 .ets 文件中
  2. 无法访问 UI:不能操作 DOM 或 @State
  3. 消息传递:通过结构化克隆传递数据
  4. 创建开销:Worker 创建需要 ~100ms

五、最佳实践

  1. 长时间任务用 Worker:持续监控、自动存档
  2. 单次任务用 taskpool:计算、文件 I/O
  3. 用完 terminateworker.terminate() 释放资源
  4. 错误处理worker.onerror 捕获异常

总结

Worker 创建常驻后台线程,适合长时间运行的任务。核心要点:独立文件创建 Worker、 postMessage/onmessage 通信、 用完后 terminate() 释放

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


相关资源:

Logo

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

更多推荐