如何使用 TaskPool?

它的使用方式很直接,适合处理短时、分散的独立任务。

  1. 编写并发函数:用 @Concurrent装饰器标记你的耗时函数。

  2. 执行任务:通过taskpool.execute()提交任务,系统会自动调度到工作线程执行,结果通过 Promise 返回

    import { taskpool } from '@kit.ArkTS';
    
    // 1. 定义并发函数,处理复杂的逻辑
    @Concurrent
    function imageProcessing(dataSlice: ArrayBuffer): ArrayBuffer {
      // 具体的逻辑操作...
      return dataSlice;
    }
    
    // 2. 执行任务
    async function handleImage(buffer: ArrayBuffer) {
      try {
        // 将任务提交给TaskPool,它会在后台线程执行
        let processedData: ArrayBuffer = await taskpool.execute(imageProcessing, buffer);
        console.info('逻辑处理完成');
      } catch (err) {
        console.error(`任务执行失败: ${err}`);
      }
    }

如何使用 Worker?

Worker 适合需要长期运行或维持状态的场景,你需要主动管理它的生命周期。

1. 创建Worker文件
在 entry/ets/workers/目录下新建一个文件,例如MyWorker.ts。

// Index.ets
import { worker } from '@kit.ArkTS';

// 1. 创建Worker实例,路径指向你刚创建的文件
const workerInstance: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');

// 2. 监听Worker发回的消息
workerInstance.onmessage = (e: MessageEvents): void => {
  console.info('主线程收到Worker消息: ', e.data);
  // 更新UI等操作
};

// 3. 向Worker发送消息
workerInstance.postMessage({ type: 'predict', value: 10 });

// 4. 当任务全部完成,记得销毁Worker以释放资源
// workerInstance.terminate();

2. 在宿主线程中使用
在你的主页面或UI逻辑的ets文件中,创建 Worker 实例并进行通信

// Index.ets
import { worker } from '@kit.ArkTS';

// 1. 创建Worker实例,路径指向你刚创建的文件
const workerInstance: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');

// 2. 监听Worker发回的消息
workerInstance.onmessage = (e: MessageEvents): void => {
  console.info('主线程收到Worker消息: ', e.data);
  // 更新UI等操作
};

// 3. 向Worker发送消息
workerInstance.postMessage({ type: 'predict', value: 10 });

// 4. 当任务全部完成,记得销毁Worker以释放资源
// workerInstance.terminate();

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐