【问题标题】:How does Dart know when a program has finished in relation to asynchronous codeDart 如何知道与异步代码相关的程序何时完成
【发布时间】:2020-12-22 15:29:28
【问题描述】:

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

  • Dart 首先在 main 中运行同步代码。
  • 所有已完成的期货都被放入事件队列并按 FIFO 顺序运行。
  • 任何微任务事件都会在事件队列中的下一个事件之前得到处理。

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

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

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

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

【问题讨论】:

    标签: asynchronous dart event-handling future


    【解决方案1】:

    Dart 程序的生命周期取决于它运行的位置。

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

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

    main 隔离 完成后程序结束。这是第一个运行的隔离。如果您启动新的隔离区,它们自己不会使程序保持活动状态,因此请确保在您的程序完成之前保持主隔离区活动。

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

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

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

    保持隔离处于活动状态的传统方法,可能是因为真正的计算是在不同的隔离中完成的,是创建一个ReceivePort,然后在其他所有操作完成时关闭它(您可能会通知他们大约通过向该接收端口发送事件)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      相关资源
      最近更新 更多