目录

Worker和宿主线程的即时消息通信

在ArkTS中,Worker相对于TaskPool存在一定的差异性,有数量限制但是可以长时间存在。一个Worker中可能会执行多个不同的任务,每个任务的执行时长或返回结果可能都不同,宿主线程需要根据情况调用Worker中的不同方法,Worker则需要及时地将结果返回给宿主线程。

下面以Worker响应"hello world"请求为例说明。

  1. 首先,创建一个执行任务的Worker。创建方法可参考创建Worker的注意事项。

    import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
    
    const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
    
    workerPort.onmessage = (e: MessageEvents) => {
      // ...
      if (e.data === 'hello world') {
        workerPort.postMessage('success');
      }
    }
  2. 这里的宿主线程是UI主线程,在宿主线程中创建Worker对象,当点击"Hello World"时调用postMessage方法向Worker线程发送消息,Worker线程将通过注册的onmessage回调处理宿主线程发送的消息。

    import { worker, ErrorEvent, MessageEvents } from '@kit.ArkTS';
    
    @Entry
    @Component
    struct Index {
      @State message: string = 'Hello World';
    
      build() {
        Row() {
          Column() {
            Text(this.message)
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
              .onClick(() => {
                // 创建Worker线程实例
                const ss: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ets');
    
                // 接收Worker线程发送的消息,收到后刷新成功并销毁Worker
                ss.onmessage = (e: MessageEvents): void => {
                  console.info('worker:: res is ' + e.data);
                  this.message = 'success';
                  // 在回调中销毁Worker线程,避免资源泄漏
                  ss.terminate();
                };
    
                // 捕获Worker线程生命周期内的全局异常,刷新失败状态(API version 18+)
                ss.onAllErrors = (err: ErrorEvent): void => {
                  console.error('worker:: error is ' + err.message);
                  this.message = 'failed';
                };
    
                // 给Worker线程发送消息
                ss.postMessage('hello world');
              })
          }
          .width('100%')
        }
        .height('100%')
      }
    }

在示例代码中,Worker接收宿主线程的消息,并处理后将结果返回给宿主线程。实现了宿主线程与Worker之间的即时通信,使宿主线程能够方便地使用Worker的运行结果。