dart线程之怎么处理异步和顺序异步任务队列
单线程的dart怎么处理异步任务的?
- 事件循环模型就是实现异步处理任务的核心。
关于阻塞式调用和非阻塞式调用的概念
- 阻塞和非阻塞关注的是程序在等待调用结果(消息、返回值)时的状态
- 阻塞式调用: 调用结果返回之前,当前线程会被挂起,调用线程只有在得到调用结果之后才会继续执行
- 非阻塞式调用: 调用执行后,当前线程不会停止执行,只需要过一段时间来检查一下有没有结果返回即可
对于顺序异步怎么实现
通过Future的then链式调用
示例:
import 'dart:io';
main(List<String> args) {
print("main start");
Future((){
//1.发送第一次请求
sleep(Duration(seconds:8));
return "第一次的结果";
}).then((value){
print(value);
//2.发送的第二次请求
sleep(Duration(seconds:3));
//return "第二次的结果";
throw Exception("第二次请求异常");
}).then((value){
print(value);
}).catchError((err){
print(err);
}).whenComplete(() => {
print("代码完成")
});
print("main end");
}
通过连续的await
-
await等待该操作结果,所以等待完继续下一个也能实现顺序异步
示例:Future getData() async{
//1.调用第一次网络请求
var res1 = await getNetworkData("argument1");
print(res1);
var res2 = await getNetworkData(res1);
print(res2);
var res3 = await getNetworkData(res2);
print(res3);
return res3;
}
await、async的意义
- 用同步的代码格式,去实现异步的调用过程
- await需要写在耗时操作之前,表示等待该操作结果
备注:通过查阅一些资料整理所得,如有错误,烦请指正。