未来和异步行为是不一样的,我不明白

时间:2019-04-04 13:19:19

标签: asynchronous dart async-await future

我在Dart中遇到async方法和Future的问题。

我想我做/理解错了,但是我不知道是什么。

我正在尝试找出Futureasync之间的区别,并了解事件循环的工作原理。我阅读了文档和有关此的许多文章。我以为自己了解,所以我尝试编写一些代码,以创建一个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"));
}

因此返回:

  1. 在未来之前打印
  2. 创建一个将来的对象,将其放入事件队列并立即返回
  3. 以后打印
  4. 从事件队列中调用将来的代码
  5. 5秒前打印
  6. 等待5秒
  7. 5秒后打印*
  8. 打印未来已完成

我认为所有这些都是正常的。

现在,我正在尝试对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,但不返回。行为是这样的:

  1. 在未来2之前打印
  2. 调用test()函数(我认为应该返回一个将来,但代码现在已执行)
  3. 5秒前打印
  4. 等待5秒钟
  5. 5秒后打印
  6. 打印未来已完成2
  7. 以后打印2

有人可以解释我是否没有正确使用async或有什么问题吗?

最佳

1 个答案:

答案 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()以异步方式获得效果。