HarmonyOS鸿蒙Next中多线程并发问题
HarmonyOS鸿蒙Next中多线程并发问题
build() {
  Progress({ value: 25, total: 100, type: ProgressType.Ring })
    .width(vp(12))
    .height(vp(12))
    .border({})
    .color(Color.White)
    .backgroundColor($r('app.color.white_3DFFFFFF'))
    .style({ strokeWidth: vp(2), status: ProgressStatus.LOADING }) // LOADING就能一直转
}
async aboutToAppear(): Promise<void> {
  // LogD(this.TAG, "aboutToAppear")
  // 多线程并发
  await eventA()
  await eventB()
  this.loadingText = $r('app.string.loging')
}
如上述代码 本人在测试中发现 由于下面的线程使用了await导致我的progress组件被阻塞了(有显示出来但并不能转动),个人了解到这种情况应该参考worker或者taskpool的解决方法来实现,请问这种具体的实现思路是怎么样的,如何修改这里的代码呢
更多关于HarmonyOS鸿蒙Next中多线程并发问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者您好,eventA、eventB方法里是否有调用while、fileIo等同步方法?由于ArkTS单线程特性,耗时的同步方法会阻塞UI、动效的渲染。
UI组件性能优化:避免在自定义组件的生命周期内执行高耗时操作。
更多关于HarmonyOS鸿蒙Next中多线程并发问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
eventB为耗时操作,打断点发现在该情况下,程序执行到eventB之后abouToAppear就挂起去执行onPageShow(其中也有一个耗时操作)中的操作了 操作结束后再回来执行eventB及其剩下操作
Q1:这种情况下导致了我的progress不动,原因分析是因为什么呢?主线程的任务导致了我的progress组件渲染掉帧是吗
Q2:UI渲染的线程任务是在主线程中一直进行的吗,他的线程任务时机与aboutoToappear与onPageShow的关系如何呢?
那么我把耗时操作放在build之后的onPageShow中 还会出现导致组件加载阻塞掉帧的问题吗,
开发者您好,见线程模型。
- ArkTS线程主要有三类:
- 主线程(执行UI绘制、管理ArkTS引擎实例、分发交互事件)。所以ArkTS同步任务会阻塞UI绘制。
- TaskPool线程(用于执行耗时操作,支持设置调度优先级、负载均衡等功能)。
- Worker线程(用于执行耗时操作,支持线程间通信)。
 
async aboutToAppear(): Promise<void> {
  // 显式创建 Promise
  new Promise<void>(async (resolve, reject) => {
    try {
      await eventA()
      await eventB.then(()=>{
        this.loadingText = $r('app.string.loging');
        resolve(); // 成功时调用 resolve
      })
    } catch (error) {
      reject(error); // 失败时调用 reject
    }
  }).then(() => {
    console.log("所有操作完成");
  }).catch((error: Error)=>{
    console.error("出错:", error);
  });
}
如果改成这样子可以嘛 想问一下
HarmonyOS Next中多线程并发通过TaskPool和Worker两种机制实现。TaskPool适用于轻量级任务,支持任务分发、执行和结果返回,自动管理线程生命周期。Worker用于长时间运行任务,需手动管理生命周期。数据传递采用序列化方式,支持标准数据类型。系统提供原子操作和锁机制保证数据同步,避免竞态条件。线程间通信通过EventEmitter实现事件监听与触发。内存管理由ArkTS运行时自动处理,确保线程安全。
在HarmonyOS Next中,使用await确实会阻塞UI线程,导致Progress组件无法正常转动。建议将eventA()和eventB()这两个耗时任务移至TaskPool中执行,通过异步回调更新UI状态。
修改后的代码示例:
import taskpool from '@ohos.taskpool';
async aboutToAppear(): Promise<void> {
  // 将耗时任务提交到TaskPool
  let task1 = new taskpool.Task(eventA);
  let task2 = new taskpool.Task(eventB);
  
  try {
    await Promise.all([taskpool.execute(task1), taskpool.execute(task2)]);
    this.loadingText = $r('app.string.loging');
  } catch (e) {
    console.error(`Task execution failed: ${e}`);
  }
}
关键点:
- 使用TaskPool创建独立任务
- 通过Promise.all()并行执行多个任务
- 任务执行完成后回到UI线程更新状态
这样既能保持Progress组件的动画流畅,又能实现多线程并发执行。注意确保eventA和eventB函数是序列化可传输的。
 
        
       
                   
                   
                  

