[英]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.