Dart中多任务等待同一Future的执行顺序及代码结果验证
Dart中多任务等待同一Future的执行顺序问题
核心问题解答
当多个任务通过await等待同一个Future时,Dart语言层面不保证这些任务会按照执行await的先后顺序被唤醒执行。虽然微任务队列是按顺序处理的,但多个await绑定的回调被加入队列的顺序,并不严格等同于调用await的先后——实际运行中若没有其他异步操作干扰,可能看起来是按顺序执行,但这种行为属于实现细节,不能作为可靠逻辑依赖。
第一段代码的输出
这段代码能保证输出2。
代码片段:
int res = 0; Future<void> foo1 () async { await Future.delayed(Duration(seconds: 2)); res = 2; } void main() async { await foo1(); print(res); }
分析:main里的await foo1()会等待foo1完全执行完毕。foo1在延迟2秒后将res设为2,随后自身的Future完成,main才会执行print(res),因此输出必然是2。
第二段代码的输出
这段代码的输出不确定,可能是2也可能是3。
代码片段:
int res = 0; Future<void> foo1 () async { await Future.delayed(Duration(seconds: 2)); } Future<void> foo2 (Future<void> f1) async { await f1; res = 2; } Future<void> foo3 (Future<void> f1) async { await f1; res = 3; } void main() async { res = 0; Future<void> f1 = foo1(); foo3(f1); foo2(f1); await f1; print(res); }
分析:foo3和foo2都绑定了同一个f1的await回调。当f1完成后,两个函数的赋值操作会被加入微任务队列,但Dart没有规定这两个微任务的执行顺序。main中的await f1完成后执行print(res),此时res的值取决于foo2和foo3哪个先完成赋值,因此结果无法确定。
内容的提问来源于stack exchange,提问作者Alpha
相关产品推荐
相关产品推荐

