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

为何Dart中Future会在main函数执行完毕后仍运行?

为什么Dart的Future能在main函数结束后继续运行?

这个问题问得很关键!其实核心原因在于Dart的**事件循环(Event Loop)**机制,咱们结合你的示例一步步拆解:

首先先看你的示例代码:

Future<void> fetchUserOrder() {
  // Imagine that this function is fetching user info from another service or database.
  return Future.delayed(Duration(seconds: 2), () => print('Large Latte'));
}

void main() {
  fetchUserOrder();
  print('Fetching user order...');
}

执行流程的细节:

  1. 同步代码优先执行:main函数是程序的入口,里面的代码会同步执行。当你调用fetchUserOrder()时,Future.delayed并不会立刻执行回调函数,而是会把这个延迟2秒的异步任务,放到Dart的**事件队列(Event Queue)**中,然后立刻返回,继续执行main里的下一行代码——也就是print('Fetching user order...')。
  2. main结束≠程序终止:当main函数的最后一行代码执行完,Dart程序并不会直接退出!它会转而启动事件循环,开始处理队列里的异步任务。
  3. 事件循环处理异步任务:事件循环会先处理**微任务队列(Microtask Queue)**里的所有任务(比如scheduleMicrotask创建的任务),之后再处理事件队列里的任务。你的Future.delayed属于事件队列任务,等2秒的延迟时间到了,事件循环就会取出这个任务,执行里面的print('Large Latte')。
  4. 程序真正退出的时机:只有当微任务队列和事件队列都完全清空,没有任何待处理的异步任务时,Dart程序才会终止运行。

所以你看到的输出是先打印同步的Fetching user order...,2秒后再打印异步任务的Large Latte,这完全符合Dart的执行规则~

内容的提问来源于stack exchange,提问作者Good

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:37:53