Dart中异步函数未按预期并行执行的问题咨询
Dart异步代码执行顺序问题解析
核心原因:Dart单线程模型+阻塞式sleep导致异步任务被延后
Dart是单线程事件循环模型,所有代码默认在同一个Isolate(主线程)里执行,任务按「同步任务→微任务队列→事件队列」的顺序依次处理,不会真正并行执行。你的代码里两个循环不能同时跑,主要有两个关键点:
同步任务优先执行,且
sleep彻底阻塞主线程
调用fu()后,先执行它的同步代码(打印start fu),然后await Future.microtask(...)会把回调放进微任务队列,随后fu()暂停并返回未完成的Future,主线程回到main函数继续执行。main里的for循环是同步任务,而且用了sleep——这是个阻塞整个Isolate的同步方法,它会让主线程完全停住,事件循环根本没机会去处理微任务队列里的回调。所以main的30次循环会全部跑完(每次卡500ms),期间异步任务完全得不到执行机会。微任务队列要等所有同步任务完成才会被处理
只有当main函数的所有同步代码执行完毕后,事件循环才会去处理微任务队列,这时候Future.microtask里的for循环才开始运行。
如何实现类似“同时运行”的效果?
如果想让两个循环交替执行,要避免用阻塞式的sleep,改用非阻塞的Future.delayed,同时让main变成异步函数(给事件循环调度的机会):
import 'dart:isolate'; import 'dart:async'; void main() async { fu(); for (int x = 0; x < 30; x++) { print(x); await Future.delayed(const Duration(milliseconds: 500)); } } Future<int> fu() async { print("start fu"); await Future.microtask(() async { for (int x = 0; x < 3; x++) { print(Isolate.current.debugName); await Future.delayed(const Duration(seconds: 1)); } print("end fu"); }); return 10; }
这里的await Future.delayed会把后续代码放进事件队列,让事件循环有机会切换到其他任务,两个循环就会交替执行了。
内容的提问来源于stack exchange,提问作者Laura Bieber
相关产品推荐
相关产品推荐

