簡體   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