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

Dart中异步函数未按预期并行执行的问题咨询

Dart异步代码执行顺序问题解析

核心原因:Dart单线程模型+阻塞式sleep导致异步任务被延后

Dart是单线程事件循环模型,所有代码默认在同一个Isolate(主线程)里执行,任务按「同步任务→微任务队列→事件队列」的顺序依次处理,不会真正并行执行。你的代码里两个循环不能同时跑,主要有两个关键点:

  1. 同步任务优先执行,且sleep彻底阻塞主线程
    调用fu()后,先执行它的同步代码(打印start fu),然后await Future.microtask(...)会把回调放进微任务队列,随后fu()暂停并返回未完成的Future,主线程回到main函数继续执行。
    main里的for循环是同步任务,而且用了sleep——这是个阻塞整个Isolate的同步方法,它会让主线程完全停住,事件循环根本没机会去处理微任务队列里的回调。所以main的30次循环会全部跑完(每次卡500ms),期间异步任务完全得不到执行机会。

  2. 微任务队列要等所有同步任务完成才会被处理
    只有当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:56:21