You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:15:29