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

when the event loop starts in Dart and how the event queue works

第一个问题是事件循环什么时候开始? 我在一个网站上读到它是在主要方法之后开始的 但是为什么当我们尝试这样的事情时

main()async {
Future(()=>print('future1'));
await Future(()=>print('future2'));
print('end of main');
}

//the output is :
//future1
//future2
//end of main

在此示例中,事件循环在我们使用 await 关键字时启动,并且 事件循环到达 future2 后暂停? 或者我错了:(

第二个问题是事件是如何添加到事件队列中的 如果是 FIFO 为什么在这个例子中 future 2 之前完成 未来 1

main(){
Future.delayed(Duration(seconds:5) , ()=>print('future1'));
Future.delayed(Duration(seconds:2) , ()=>print('future2')); 
}

事件循环运行当没有其他事情时运行ning(例如主要方法已经完成,你正在等待一些未来完成) .

您的示例很有意义,因为第一行将事件放入事件队列,所以现在队列中的第一项是“print('future1')”。在下一行中,您将另一个调用“print('future2')”的事件放入队列中,现在等待该事件完成。

因为你的主要方法没有等待什么,所以事件循环将被执行。由于队列中的第一个事件是“print('future1')”,因此它将首先执行。但是由于主要方法仍在等待未来的“print('future2')”完成,因此事件循环需要执行另一个事件,这将是“print('future2')”。

由于此事件是 main 方法正在等待的事件(并且事件队列中没有更多事件),因此 main() 将 运行 最后一次调用“print('end of main')".

在您的下一个示例中,您认为 Future 和 Future.delayed 是相同的,但事实并非如此。使用 Future.delayed 之前事件队列中没有任何事件。相反,运行 在 VM 外部有一个线程,它知道下一个计时器何时应该触发,最终将一个事件放入队列。因此,只有当计时器到期时,事件才会被放入事件队列(因此​​,future2 将首先执行)。