我正在制作一个使用异步的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()完成。
这是我想要的结果:
从上开始,在下结束,结束
答案 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()作为另一个任务运行。这样,“等待”将等待,因为它将是异步调用的第一个真实实例。