如何在子线程发起一个同步请求,服务器有响应或出错才返回

发起一个同步的请求,等服务器返回时候,这个线程才继续工作,该如何实现?

HarmonyOS
2024-09-18 12:03:33
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

可以使用TaskPool和Worker来实现:

1、当调度独立的任务,或者一系列任务为静态方法实现,或者可以通过单例构造唯一的句柄或类对象,可在不同任务线程之间使用时,推荐使用TaskPool。

2、当一系列同步任务需要使用同一个句柄调度,或者需要依赖某个类对象调度,无法在不同任务池之间共享时,需要使用Worker。

参考代码:

// Handle.ets 代码 
"use shared" 
 
@Sendable 
export default class Handle { 
  private static instance: Handle = new Handle; 
 
  static getInstance(): Handle { 
    // 返回单例对象 
    return Handle.instance; 
  } 
 
  static syncGet(): void { 
    // 同步Get方法 
  } 
 
  static syncSet(num: number): number { 
    // 模拟同步步骤1 
    console.info("taskpool: this is 1st print!"); 
    // 模拟同步步骤2 
    console.info("taskpool: this is 2nd print!"); 
    return ++num; 
  } 
 
  static syncSet2(num: number): number { 
    // 模拟同步步骤1 
    console.info("taskpool: this is syncSet2 1st print!"); 
    // 模拟同步步骤2 
    console.info("taskpool: this is syncSet2 2nd print!"); 
    return ++num; 
  } 
}
import Handle from './Handle'; 
import { taskpool } from '@kit.ArkTS'; 
 
// 步骤1: 定义并发函数,内部调用同步方法 
@Concurrent 
async function func(num: number): Promise<number> { 
  // 调用静态类对象中实现的同步等待调用 
  // 先调用syncSet方法并将其结果作为syncSet2的参数,模拟同步调用逻辑 
  let tmpNum: number = Handle.syncSet(num); 
  console.info("this is Child_Thread") 
  return Handle.syncSet2(tmpNum); 
} 
 
// 步骤2: 创建任务并执行 
async function asyncGet(): Promise<void> { 
  // 创建task、task2并传入函数func 
  let task: taskpool.Task = new taskpool.Task(func, 1); 
  let task2: taskpool.Task = new taskpool.Task(func, 2); 
  // 执行task、task2任务,await保证其同步执行 
  let res: number = await taskpool.execute(task) as number; 
  let res2: number = await taskpool.execute(task2) as number; 
  // 打印任务结果 
  console.info("taskpool: task res is: " + res); 
  console.info("taskpool: task res2 is: " + res2); 
} 
 
@Entry 
@Component 
struct Index { 
  @State message: string = 'Hello World'; 
 
  build() { 
    Row() { 
      Column() { 
        Text(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(async () => { 
            // 步骤3: 执行并发操作 
            asyncGet(); 
            let num: number = Handle.syncSet(100); 
            console.info("this is Main_Thread!") 
          }) 
      } 
      .width('100%') 
      .height('100%') 
    } 
  } 
}

参考链接

多线程同步任务开发

分享
微博
QQ
微信
回复
2024-09-18 16:01:43
相关问题
HarmonyOS HTTPS请求如何验证服务器证书
476浏览 • 1回复 待解决
请求服务器图片资源刷新卡片
746浏览 • 1回复 待解决
Web组件如何发起一个下载任务?
328浏览 • 1回复 待解决
如何创建一个worker线程
825浏览 • 1回复 待解决
鸿蒙系统类似苹果的服务器吗?
9043浏览 • 1回复 待解决
HarmonyOS 如何返回一个颜色?
185浏览 • 1回复 待解决
服务器如何安装双centos系统?
2033浏览 • 1回复 待解决
mysql shell 如何查看服务器状态?
3966浏览 • 1回复 待解决
centos服务器系统宕机
1980浏览 • 1回复 待解决
如何在Worker中开启多级线程
258浏览 • 1回复 待解决
如何实现一个页面显示窗口
537浏览 • 1回复 待解决
谁知道如何创建一个线程
369浏览 • 1回复 待解决