asynchronous - 事件循环何时在 Dart 中启动以及事件队列如何工作
问题描述
第一个问题是事件循环何时开始?我在一个网站上读到它是在 main 方法之后开始的,但是为什么当我们尝试这样的事情时
main()async {
Future(()=>print('future1'));
await Future(()=>print('future2'));
print('end of main');
}
//the output is :
//future1
//future2
//end of main
在这个例子中,当我们使用 await 关键字时,事件循环开始,在事件循环到达 future2 之后它被暂停了?或者我错了:(
第二个问题是事件如何添加到事件队列,如果它是先进先出的,为什么在这个例子中,未来 2 在未来 1 之前完成
main(){
Future.delayed(Duration(seconds:5) , ()=>print('future1'));
Future.delayed(Duration(seconds:2) , ()=>print('future2'));
}
解决方案
事件循环在没有其他东西运行时运行(例如 main 方法已完成,您正在等待某个未来完成)。
您的示例很有意义,因为第一行将事件放在事件队列中,所以现在队列中的第一项是“print('future1')”。在下一行中,您将另一个事件放在调用“print('future2')”的队列中,现在您等待该事件完成。
由于您的 main 方法没有等待某些东西,因此将执行事件循环。由于队列中的第一个事件是“print('future1')”,那么这将首先执行。但由于主要方法仍在等待未来的“print('future2')”完成,因此事件循环需要执行另一个事件,该事件将是“print('future2')”。
由于此事件是 main 方法正在等待的事件(并且事件队列中没有更多事件),因此 main() 将运行最后一次调用“print('end of main')”。
在您的下一个示例中,您认为 Future 和 Future.delayed 是相同的,但事实并非如此。使用 Future.delayed 之前,事件队列中没有任何事件。相反,在 VM 外部运行一个线程,它知道下一个计时器何时应该触发,最终将一个事件放在队列中。因此,只有当计时器到期时,事件才会被放入事件队列中(因此,future2 将首先执行)。
推荐阅读
- mysql - SQL:我想比较 10 个连续的值
- java - Java x64 接口拒绝运行
- docker - Nuxt.js 路由器配置在运行时或应用程序启动之前
- android - AutoCompleteTextView 下拉菜单未显示
- javascript - 无法在动态创建 html 和 iframe 时添加动态脚本和样式标签
- javascript - 函数式 JavaScript 设置本地存储
- java - PHP Bcrypt Salt 自 7.0 起
- webview2 - 在 Microsoft.Web.WebView2.Wpf 组件中禁用 Devtools
- c# - 按住 Input.GetMouseButtonDown(0) 是否连续将 BOOL 设置为 TRUE 到我的动画?
- flutter - 如何检查图像是否模糊