HarmonyOS 鸿蒙Next中Taskpool的使用

HarmonyOS 鸿蒙Next中Taskpool的使用

//创建任务
let task = new taskpool.Task(taskpool1,this.crtList)

taskpool.execute(task).then((value)=>{
  console.log("zqf value :",JSON.stringify(value))
  this.mIndexList.push(value as IndexListData)
})

task.onReceiveData(()=>{
  this.isShow = true
})
@Concurrent
async function taskpool1(crtList :DataIndexAll[]) {

  console.log("zqf",'taskpool1')
  crtList.forEach((item,index:number)=>{

    console.log("zqf item :",JSON.stringify(item))
    Net.get(crtList[index].resourceUrl)
      .requestString((data)=>{
        console.log("zqf data :",JSON.stringify(data))
        if(data){
          //在任务执行过程中向宿主线程发送消息
          let a = JSON.parse(data) as IndexJsonData
          let image :string = item.resourcePreviewUrl
          let title =a.data.content[0].content.split('<p>')[1].split('</p>')[0]
          let mIndexListData : IndexListData ={
            imageStr:image,
            title : title
          }
          taskpool.Task.sendData(mIndexListData);
        }
      })
  })
}

以上代码,为什么调用了线程池,但是没有走里边的方法


更多关于HarmonyOS 鸿蒙Next中Taskpool的使用的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

楼主有较完整的代码吗?给的片段跑不起来,我这边都能正常执行到的taskpool1里面的

import { taskpool } from '@kit.ArkTS'

@Entry
@Component
struct TaskpoolDemo {
  build() {
    Column() {
      Button('点击')
        .onClick(() => {
          //创建任务
          let task = new taskpool.Task(taskpool1)
          taskpool.execute(task).then((value) => {
            console.log("zqf value :")
          })
          task.onReceiveData(() => {
            // this.isShow = true
          })
        })
    }
  }
}

@Concurrent
async function taskpool1(){
  console.log('执行子任务')
}

更多关于HarmonyOS 鸿蒙Next中Taskpool的使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


好像是;类型不支持复杂的,

实现任务的函数入参确实有限制,文档中有描述:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/taskpool-introduction#taskpool注意事项

实现任务的函数入参需满足序列化支持的类型,目前不支持使用@State装饰器、@Prop装饰器、@Link装饰器等装饰器修饰的复杂类型。

在HarmonyOS Next中,Taskpool是用于并发任务管理的轻量级模块,支持任务创建、调度和执行。它通过任务池管理多个并发任务,提升应用性能。Taskpool提供任务优先级设置、依赖关系管理和取消机制,确保任务高效运行。开发者可使用TaskPool API定义任务函数,提交至任务池执行,无需直接处理线程细节。Taskpool与ArkTS结合,适用于异步操作和后台处理,优化资源利用。

在HarmonyOS Next的Taskpool使用中,你遇到的问题很可能是由于并发任务执行机制导致的。从代码分析:

  1. @Concurrent注解问题:确保taskpool1函数正确使用了@Concurrent装饰器,这是任务能在工作线程执行的前提。

  2. 异步网络请求处理:在@Concurrent函数中,Net.get().requestString()是异步操作,但函数本身被标记为async却没有await。这可能导致函数立即返回,未等待网络请求完成。

  3. 任务执行时机:taskpool.execute()会立即返回Promise,但实际的任务执行可能在后台线程,需要确保主线程不会提前结束。

  4. 数据发送时机:taskpool.Task.sendData()在网络请求回调中调用,如果网络请求未完成或回调未触发,就不会发送数据。

建议检查:

  • 网络请求是否正常返回数据
  • 确认@Concurrent装饰器正确应用
  • 在taskpool1函数中添加错误处理,排查执行路径

可以通过在taskpool1函数开始处添加日志,确认函数是否被调用,以及在网络请求回调中添加日志,确认是否执行到sendData部分。

回到顶部