Dart中的异步/等待

时间:2019-09-13 02:57:03

标签: dart async-await

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

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()完​​成。

这是我想要的结果:

  

从上开始,在下结束,结束

1 个答案:

答案 0 :(得分:4)

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

  

(中断),标记为异步的函数现在同步运行,直到第一个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()作为另一个任务运行。这样,“等待”将等待,因为它将是异步调用的第一个真实实例。