繁体   English   中英

Dart中的异步/等待

[英]Async/Await in Dart

我正在制作一个使用异步的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()完​​成。

这是我想要的结果:

以上开始以下完成

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

(中断)标记为异步的函数现在可以同步运行,直到第一个await语句为止。 以前,它们将在运行任何代码之前在函数体顶部返回一次事件循环( 发行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()调度为作为另一个任务运行。 这使得“等待”将要等待,因为它将是异步调用的第一个真实实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM