Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous Future和async行为不一样,我不知道';我不明白_Asynchronous_Dart_Async Await_Future - Fatal编程技术网

Asynchronous Future和async行为不一样,我不知道';我不明白

Asynchronous Future和async行为不一样,我不知道';我不明白,asynchronous,dart,async-await,future,Asynchronous,Dart,Async Await,Future,我在Dart中遇到了async方法和Future的问题 我想我错了,但我不知道是什么 我试图找出Future和async之间的区别,并理解事件循环是如何工作的。我阅读了文档和很多关于这方面的文章。我想我明白了,所以我试着编写一些代码,用sleep()调用创建一个Future对象 首先,我尝试了Future,我认为它应该: main(List<String> arguments) { print('before future'); test_future();

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

我想我错了,但我不知道是什么

我试图找出
Future
async
之间的区别,并理解事件循环是如何工作的。我阅读了文档和很多关于这方面的文章。我想我明白了,所以我试着编写一些代码,用
sleep()
调用创建一个
Future
对象

首先,我尝试了
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"));
}
通常,在调用
test().then()
时,它应该将
test()
的内容放入事件队列中,并立即返回
Future
,但不返回。行为如下:

  • 在未来2之前打印
  • call test()函数(我认为应该返回一个future,但代码现在就执行)
  • 5秒前打印
  • 等待5秒钟
  • 5秒后打印
  • 打印未来已完成2
  • 以后打印2
  • 有人能解释一下我是否正确使用了
    async
    ,或者是否有什么问题吗


    最好的

    您应该知道sleep()只会阻塞整个程序。sleep()与事件循环或异步执行没有任何关系。也许您希望使用以下选项:

    await Future.delayed(const Duration(seconds: 5), (){}); 
    
    异步系统调用不会阻止隔离。事件队列仍在处理中(在调用系统调用后立即继续)。如果您进行同步系统调用,它们会像睡眠一样阻塞


    在api.dartlang.org/stable/2.2.0/dart-io/File/readAsLinesSync.html等系统调用的
    dart:io
    中通常存在同步和异步变体。尽管
    sleep
    没有同步后缀,但它是同步的,无法解决。您可以使用如上所示的
    Future.delayed()
    以异步方式获得效果

    我没有深入研究您的代码,但是您应该知道
    sleep()
    只是阻塞了整个程序<代码>睡眠()与事件循环或异步执行没有任何关系。也许您想使用
    wait Future.delayed(const Duration(秒数:5),(){})相反。是的,我一个小时前就知道了<代码>睡眠
    不是由系统或服务器执行的,它是在dart单线程内执行的,这就是它阻止代码的原因。我想模拟一个使用异步/等待的长过程,但这不是最好的方法。顺便说一句,如果我不得不做一个不使用系统I/O或用户输入的繁重操作,那么这种行为会和睡眠一样吗?在这种情况下,必须使用隔离物吗?比如,如果我用一个循环替换
    sleep
    ,这个循环增加了int 10亿次,那么异步系统调用不会阻止隔离。事件队列仍在处理中(在调用系统调用后立即继续)。如果您进行同步系统调用,它们会像
    sleep
    一样阻塞。不,您不能调用系统调用sync或async。在系统调用的
    dart:io
    中通常有同步和异步变体,如。尽管
    sleep
    没有
    sync
    后缀,但它是同步的,无法解决。您可以如上所示
    Future.delayed()
    以异步方式获得效果。谢谢大家。如果你想让我勾选,你可以写一个答案。
    await Future.delayed(const Duration(seconds: 5), (){});