我在Dart中遇到async
方法和Future
的问题。
我想我做/理解错了,但是我不知道是什么。
我正在尝试找出Future
和async
之间的区别,并了解事件循环的工作原理。我阅读了文档和有关此的许多文章。我以为自己了解,所以我尝试编写一些代码,以创建一个Future
对象,并在其中调用sleep()
。
首先,我尝试使用Future
,但我认为它的表现应该是这样的:
main(List<String> arguments) {
print('before future');
test_future();
print('after future');
}
test_future() {
Future (() {
print('Future active before 5 seconds call');
sleep(Duration(seconds: 5));
print('Future active after 5 seconds call');
}).then((_) => print("Future completed"));
}
因此返回:
我认为所有这些都是正常的。
现在,我正在尝试对async
做同样的事情。在文档中,将async
关键字添加到函数中使其立即返回Future
。
所以我写了这个:
main(List<String> arguments) {
print('before future 2');
test().then((_) => print("Future completed 2"));
print('after future 2');
}
test() async {
print('Future active before 5 seconds call');
sleep(Duration(seconds: 5));
print('Future active after 5 seconds call');
}
通常,在调用test().then()
时,应将test()
的内容放入事件队列中,并立即返回Future
,但不返回。行为是这样的:
有人可以解释我是否没有正确使用async
或有什么问题吗?
最佳
答案 0 :(得分:1)
您应该意识到sleep()只会阻塞整个程序。 sleep()与事件循环或异步执行没有任何关系。也许您想使用:
await Future.delayed(const Duration(seconds: 5), (){});
异步系统调用不会阻止隔离。事件队列仍在处理中(在调用系统调用后立即继续)。如果您进行同步系统调用,它们将像睡眠一样阻塞。
dart:io
的系统调用中经常有同步和异步变体,例如api.dartlang.org/stable/2.2.0/dart-io/File/readAsLinesSync.html。即使sleep
没有同步后缀,它也已同步并且无法解决。您可以如上所述使用Future.delayed()
以异步方式获得效果。