【问题标题】:Async/Await in DartDart 中的异步/等待
【发布时间】:2020-01-14 22:11:09
【问题描述】:

我正在制作一个使用异步的 Flutter 应用程序,但它不像我理解的那样工作。所以我对 dart 中的 async 和 await 有一些疑问。这是一个例子:

Future<int> someFunction() async {
  int count = 0;
  for (int i=0; i< 1000000000;i ++) {
    count+= i;
  }
  print("done");
  return count;
}

Future<void> test2() async {
  print("begin");
  var a = await someFunction();
  print('end');
}

void _incrementCounter() {
  print("above");
  test2();
  print("below");
}

test2() 函数需要很长时间才能完成。正确的?所以我想要的是当 test2 让他的工作一直运行到完成时,一切都会继续运行而不是等待 test2()。

当我运行 _incrementCounter() 函数时,它会显示结果:

从头到尾完成

问题是它没有立即显示“下面”,而是等到 someFunction() 完成。

这是我想要的结果:

上面开始下面完成结束

【问题讨论】:

标签: dart async-await


【解决方案1】:

这是自 Dart 2.0 更改以来的预期行为,可在更改日志中找到:

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

在我给出解决方案之前,我想提醒您异步代码没有在另一个线程中运行,因此以下概念:

继续他的工作直到完成,一切都会继续进行而不是 等待 test2()

很好,但在某些时候,您的应用程序将等待 test2() 完成,因为它是作为作业队列中的任务生成的,在它完成之前它不会让其他作业运行。如果您想要不减速的体验,您可以将作业拆分为多个较小的作业或生成一个隔离(在另一个线程中运行)来运行计算并稍后返回结果。

这是让您的示例工作的解决方案:

Future<int> someFunction() async {
  int count = 0;
  for (int i=0; i< 1000000000;i ++) {
    count+= i;
  }
  print("done");
  return count;
}

Future<void> test2() async {
  print("begin");
  var a = await Future.microtask(someFunction);
  print('end');
}

void _incrementCounter() {
  print("above");
  test2();
  print("below");
}

main() {
  _incrementCounter();
}

通过使用 Future.microtask 构造函数,我们将 someFunction() 调度为作为另一个任务运行。这使得“等待”将等待,因为它将是异步调用的第一个真正实例。

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 2021-10-04
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2023-03-10
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多