繁体   English   中英

事件循环何时在 Dart 中开始以及事件队列如何工作

[英]when the event loop starts in Dart and how the event queue works

第一个问题是事件循环何时开始? 我在一个网站上读到它是在 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 将首先执行)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM