首页 > 解决方案 > Dart 程序究竟何时终止?

问题描述

我想知道 Dart 程序何时终止。

采取以下程序:

import 'dart:isolate';

Future<void> calculateTheAnswer(SendPort port) async {
  await Future.delayed(Duration(seconds: 1));
  port.send(42);
}

void main() async {
  var port = ReceivePort()..listen(print);
  await Isolate.spawn(calculateTheAnswer, port.sendPort)
    ..addOnExitListener(port.sendPort, response: 100);
}

在这里,主隔离生成另一个隔离,该隔离在一秒后仅发送 42。发送答案后,隔离终止,导致退出侦听器触发。实际上,程序输出 42,然后输出 100,因此隔离终止。

但 Dart 程序仍在继续运行。为什么?

标签: dartdart-isolates

解决方案


Dart 程序在其所有隔离项都终止时终止。

如果事件循环中没有更多事件并且不再有 open ,则隔离终止ReceivePort。为了实现这一点,Dart VM 跟踪ReceivePort隔离创建的所有 s。一个极端的例子是void main() => ReceivePort(),一个不会终止的程序。

通过在最后关闭主隔离中的端口,程序确实终止了:

void main() async {
  var port = ReceivePort()..listen(print);
  var exitPort = ReceivePort();
  exitPort.listen((_) {
    port.close();
    exitPort.close();
  });

  await Isolate.spawn(calculateTheAnswer, port.sendPort)
    ..addOnExitListener(exitPort.sendPort);
}

推荐阅读