Worker线程的使用

1.概念

创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处理耗时操作但不可以直接操作UI。

2.作用

Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与主线程分离,在后台线程中运行一个脚本操作耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。由于Worker一旦被创建则不会主动被销毁,若不处于任务状态一直运行,在一定程度上会造成资源的浪费,应及时关闭空闲的Worker。

3.创建Woker线程

export interface MessageDownload {
  work: string
  Context?: Context
}



// 1.监听worker线程的消息
workerPort.onmessage = (e: MessageEvents) => {
  //2.定义要执行的任务 : 下载文件
  const data = e.data as MessageDownload
  if (data.work === 'start') {
    downloadFile(data.Context as Context)
  }
}


// 下载文件
async function downloadFile(Context: Context) {
  const task = await request.downloadFile(Context, {
    url: 'https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_package_901_9/c1/v3/Jnel8gI8R1WszYSI3QKjLw/devecostudio-windows-5.0.3.900.zip?HW-CC-KV=V1&HW-CC-Date=20241019T022307Z&HW-CC-Expire=7200&HW-CC-Sign=E61763FE291FC1859C36F71D0396384908FF1F88A8AF4CB8DA7F47AE01236F58',
    filePath: Context.cacheDir + '/test.zip'
  })
  task.on('progress', (current, total) => {
    const progress = (current / total * 100).toFixed(2) + '%'
    // 4.通知页面:消息的内容必须是可序列化对象
    workerPort.postMessage({
      progress
    })
    if (current === total) {
      workerPort.close()
    }
  })
}

4.新建页面,创建Worker任务

import { worker } from '@kit.ArkTS'
import { MessageDownload } from '../../workers/Worker'

@Entry
@Component
struct WorkerCase {
  @State
  progress: string = '0%'
  myWorker?: worker.ThreadWorker

  createWorker() {
    // 1.创建worker任务
    //路径规范:模块名/worker文件夹/Worker文件名.ets
    const myWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ets')
    this.myWorker = myWorker
    //3.页面通知worker开始下载
    myWorker.postMessage({
      work: 'start',
      Context: getContext()
    })
    //5.页面接收worker进度信息
    myWorker.onmessage = (e) => {
      this.progress = e.data.progress as string
    }
  }

  testWorker() {
    try {
      this.myWorker?.postMessage({
        work: 'test'
      } as MessageDownload)
    } catch (e) {
      console.error(e)
    }
  }

  build() {
    Column({ space: 10 }) {
      Text('下载速度:' + this.progress)
      Button('下载DevEco Studio')
        .onClick(() => {
          this.createWorker()
        })
      Button('关闭Worker线程')
        .onClick(() => {
          this.testWorker()
        })
    }
    .height('100%')
    .width('100%')
    .padding(50)
  }
}

5.代码实现图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值