【问题标题】:Dart waiting for an async function to complete without awaitDart 等待异步函数完成而不等待
【发布时间】:2023-03-10 23:52:01
【问题描述】:

我已将问题缩小到以下代码。我是 Dart 的新手,我似乎无法弄清楚为什么代码不会在打印数字 1-10 之前继续打印“完成”。

import 'dart:async';

Future<bool> wait() async {
  for(int i = 0; i < 10; i++){
    print('$i');
  }
  return true;
}

Future testAsync() async {
  print('starting');
  wait();
  print('done');

}

main(List<String> arguments){
  testAsync();
}

既然wait();前面没有await关键字,程序不应该执行print('done');然后打印出数字吗?出于某种原因,它一直在等待wait(); 完成。

【问题讨论】:

  • 异步不像分离的线程那样工作。

标签: asynchronous dart async-await


【解决方案1】:

这是自 Dart 2.0.0 以来的预期行为:

(中断)标记为 async 的函数现在同步运行,直到第一个 await 语句。以前,它们会在任何代码运行之前在函数体的顶部返回一次事件循环 (issue 30345)。

https://github.com/dart-lang/sdk/blob/stable/CHANGELOG.md

由于您的async 方法实际上并没有等待任何东西,因此整个方法是同步执行的。

您可以将您的代码更改为这样的代码以获得您想要的行为:

import 'dart:async';

Future<bool> wait() async {
  await Future.microtask(() {
    for (int i = 0; i < 10; i++) {
      print('$i');
    }
  });

  return true;
}

Future testAsync() async {
  print('starting');
  wait();
  print('done');
}

main(List<String> arguments) {
  testAsync();
}

【讨论】:

  • 哦,我明白了。谢谢。但我必须说,我不明白为什么会做出这种改变。是否不可能在不等待的情况下异步运行函数?你能不能只调用函数并让它们在后台运行并忘记它们?这不是可能有用的功能吗?
  • Dart 代码在单个线程中运行,除非您使用 Isolates。我可以推荐阅读:dartlang.org/articles/event-loop
猜你喜欢
  • 2019-11-29
  • 2019-06-16
  • 2017-12-11
  • 2020-10-04
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多