【问题标题】:when the event loop starts in Dart and how the event queue works事件循环何时在 Dart 中启动以及事件队列如何工作
【发布时间】:2019-10-05 10:01:13
【问题描述】:

第一个问题是事件循环何时开始? 我在一个网站上读到它是在 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')); 
}

【问题讨论】:

    标签: asynchronous dart future event-loop


    【解决方案1】:

    事件循环在没有其他东西运行时运行(例如 main 方法已完成,您正在等待某个未来完成)。

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

    由于您的 main 方法没有等待某事,因此将执行事件循环。由于队列中的第一个事件是“print('future1')”,那么这将首先执行。但由于 main 方法仍在等待未来的“print('future2')”完成,因此事件循环需要执行另一个事件,该事件将是“print('future2')”。

    由于这个事件是 main 方法正在等待的事件(并且事件队列中没有更多事件),所以 main() 将运行最后一次调用“print('end of main')”。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-14
      • 2021-04-03
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      相关资源
      最近更新 更多