Dart 如何知道与异步代码相关的程序何时完成

How does Dart know when a program has finished in relation to asynchronous code

我一直在学习 Dart 中的事件循环和异步代码执行。以下是我的理解:

我缺少的部分是未完成的未来呢?如果你有这样的事情怎么办:

final myFuture = Future<int>.delayed(
  Duration(seconds: 1),
  () => 42,
);

在那一秒的延迟中,假设所有同步代码、微任务和事件 queue 任务都已完成。 Dart 如何知道它不应该终止程序?未完成的期货有没有小持有人?

我不知道我的标题是否准确反映了我的要求。随意编辑它。

Dart 程序的 life-time 取决于它 运行 的位置。

浏览器中的代码 运行 不会停止,除非页面消失。网页不会像脚本或应用程序那样结束。

因此,您可能真正要问的是 Dart VM 上的程序 运行 何时停止。简短的回答是:当没有更多事可做时(在主隔离中)。

main isolate 完成后程序结束。这是 运行 的第一个隔离。如果你启动新的 isolate,它们不会让程序自己保持活动状态,所以确保在你的程序完成之前保持主 isolate 活动。

当无事可做时,隔离就完成了,并且没有好的方法来接收指令来做更多的事情。 这意味着:

  • 没有密码运行ning.
  • 事件和微任务队列为空。
  • 没有预定的计时器或未完成的 I/O 操作(您可以将它们视为保存在单独的内部工作队列中,当它们准备好结果时,它们会触发主事件队列中的事件。这些队列也需要为空才能完成程序。
  • 没有打开的接收端口(ReceivePort, RawReceivePort)。

这意味着无事可做,也没有开放的通信渠道来接收消息。

保持 isolate 活动的传统方法(可能是因为真正的计算是在不同的 isolate 中完成的)是创建一个 ReceivePort,然后在其他一切都完成后关闭它(你d 可能会通过向 receive-port) 发送事件来通知他们。