如何在Dart/Flutter中使用async/await实现并行处理?
Dart/Flutter 实现对应异步并行逻辑的方法
Dart的async/await语法设计和C#非常接近,你描述的「先启动异步任务、执行其他操作、最后等待任务完成」的逻辑可以直接对齐实现,核心是利用Future(对应C#的Task)的特性:调用async函数时如果不立刻await,拿到返回的Future时任务就已经启动,不会阻塞后续同步代码执行。
基础写法(对应C#示例)
和你给出的C#代码几乎一一对应:
// 使用await的方法需要添加async关键字 void main() async { // 1. 启动异步任务,拿到Future实例,此时任务已经开始执行,不会阻塞后续代码 var t = myFunctionAsync(); // 2. 执行其他同步操作 executeTask1(); executeTask2(); // 3. 等待异步任务执行完成,获取执行结果 await t; }
注意:如果在调用
myFunctionAsync()时提前加了await,就会变成同步等待任务执行完才走后续代码,完全失去并行效果,这点和C#的行为完全一致。
不同场景的注意事项
Dart是基于单Isolate(可理解为单线程事件循环)的模型,和C#默认线程池调度Task的逻辑有差异,需要根据任务类型选择实现:
- 对于IO类异步任务(网络请求、文件读写、数据库操作、平台通道调用等):直接用上面的基础写法即可,这类任务执行时会让出事件循环,不会阻塞后续同步代码,可以实现预期的交错执行效果。
- 对于CPU密集型计算任务(大图压缩、大体积JSON解析、海量数据计算等):普通Future默认运行在主Isolate,会直接阻塞事件循环,后续的
executeTask1/executeTask2必须等计算任务执行完才会运行,无法实现并行。这时候需要把计算任务放到独立Isolate中执行,才能真正利用多核实现并行:
如果是Flutter环境,也可以用框架封装的import 'dart:isolate'; void main() async { // 将CPU密集任务提交到独立Isolate运行,返回的Future用法和普通Future完全一致 var t = Isolate.run(() => myCpuHeavyFunction()); executeTask1(); executeTask2(); var result = await t; }compute顶层函数,更方便传递参数,本质也是创建独立Isolate执行计算任务。
内容的提问来源于stack exchange,提问作者under
相关产品推荐
相关产品推荐

