为什么异步功能中的睡眠不会异步执行

时间:2019-06-21 07:59:23

标签: dart

void task() async {
  print("working...");
  sleep(Duration(seconds: 4));
  print("done");
}

当我这样奔跑时:

task();
task();
task();

我得到了结果:

working...
done
working...
done
working...
done

我的预期结果是:

working working working done done done

当我更改

 sleep(Duration(seconds: 4)); 

awiat Dio().get("xxx.xx.xx.xx");  

它按我的预期工作。 为什么即使我将它放在异步函数中,睡眠仍然会停止主线程? 我对aysnc的工作方式感到困惑,当一个函数被标记为异步函数时,我会一直不知所措,如果不使用await,它将异步执行。

2 个答案:

答案 0 :(得分:0)

在Dart 2中,异步函数将同步执行,直到遇到第一次等待或返回。由于您的task()函数都没有,因此代码将同步运行,进入休眠状态并暂停4秒钟,然后再继续。如果将await添加到睡眠中,则将获得预期的输出。但是,由于睡眠受到阻碍,每次打印“工作中...”之间仍然会有四秒钟的延迟。

void task() async {
  print("working...");
  await sleep(Duration(seconds: 4));
  print("done");
}

Dart文档中有一个关于异步和等待的有用部分:

https://dart.dev/tutorials/language/futures

答案 1 :(得分:0)

  

为什么即使我将其置于异步函数中,睡眠仍会停止主线程?

sleep的全部重点是暂停执行。 sleep是阻止呼叫:

  

请谨慎使用,因为在睡眠调用中被阻塞时,无法单独处理异步操作。

您可能想在测试中使用Future.delayed

请注意,在执行await之前,还必须在函数中使用Future来使执行 产生并等待print("done")完成。