HarmonyOS鸿蒙Next中开个线程这样写行不行

HarmonyOS鸿蒙Next中开个线程这样写行不行 我有很多个耗时 IO 操作, 使用 taskpool 开线程,来执行耗时任务。

runTask 写好放那里不动,一直扩展增加 @Concurrent 修饰的方法就行了。

这样写行不行,有没有更好的写法。

import LoadingDialog from '@lyb/loading-dialog';
import { taskpool } from '@kit.ArkTS';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('HelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(async () => {
          
          LoadingDialog.showLoading({ msg: "加载中" });
          let result = await this.runTask(jisuan, ["ssss"]);
          LoadingDialog.showSuccess({ msg: "成功" + result });
          
        })
    }
    .height('100%')
    .width('100%')
  }

  async runTask<T>(
    taskFn: (...args: Object[]) => T,
    args: Object[] = [],
  ): Promise<T | null> {

    try {
      const task = new taskpool.Task(taskFn, args);
      const result = await taskpool.execute(task);

      if (result === 0 || result === null) {
        return null;
      }
      return result as T;
    } catch (e) {
      return null;
    }

  }
}


[@Concurrent](/user/Concurrent)
function jisuan(o: object): String {
  let sum = 0;
  for (let i = 0; i < 100000000; i++) { // 10亿次循环
    sum += i;
  }
  return "结果:" + o;
}

更多关于HarmonyOS鸿蒙Next中开个线程这样写行不行的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,可以使用TaskPool或Worker创建线程。TaskPool适用于轻量级任务,Worker适用于长时间任务。示例代码:

import taskpool from '@ohos.taskpool';

@Concurrent
function myTask(): void {
  // 任务逻辑
}

let task = new taskpool.Task(myTask);
taskpool.execute(task);

或使用Worker:

let worker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');
worker.postMessage('data');

确保线程代码符合HarmonyOS API规范。

更多关于HarmonyOS鸿蒙Next中开个线程这样写行不行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中使用taskpool和@Concurrent处理耗时IO操作的写法基本可行,但有几个优化点:

  1. 类型安全:建议为runTask的泛型参数和函数参数定义更明确的类型,避免使用Object[]。例如使用泛型约束args类型:
async runTask<T, A extends any[]>(
  taskFn: (...args: A) => T,
  args: A = [] as A
): Promise<T | null>
  1. 错误处理:当前catch块直接返回null会丢失错误信息。建议至少记录错误日志,或者抛出特定异常:
catch (e) {
  console.error("Task execution failed:", e);
  return null;
}
  1. 资源管理:对于大量IO操作,考虑添加取消机制和超时控制,避免任务积压。

  2. 性能监控:可在runTask中添加执行时间统计,便于优化任务分配。

当前架构的扩展性不错,通过@Concurrent修饰方法确实可以方便地添加新任务。如果IO操作非常密集,还可以考虑使用TaskGroup来并行执行多个任务。

回到顶部