例如:
import 'dart:isolate';
void main() { var p = new ReceivePort(); }
这将使整个 VM 挂起,直到我 Ctrl-C 它。为什么是这样?
例如:
import 'dart:isolate';
void main() { var p = new ReceivePort(); }
这将使整个 VM 挂起,直到我 Ctrl-C 它。为什么是这样?
Dart 的main
功能运作方式与其他平台略有不同。它更像是一个“初始化”,而不是其他任何东西。它可以退出并且应用程序可以继续运行。如果 Dart VM 应用程序正在侦听事件,它就会保持活动状态。这通常意味着一个或多个 open Stream
。AReceivePort
是一个Stream
。关闭此流将终止应用程序。
您可以通过运行此脚本dart --observe script.dart
并在 Observatory 中查看应用程序来验证这一点。你会注意到你有一个隔离,它是“空闲的”——这意味着有开放的端口正在等待消息。您可以单击隔离面板中的“查看端口”,这ReceivePort
将是列表中的唯一项目。一般来说,如果您挂起并且无法弄清楚原因,请启动 Observatory 并检查哪些端口是打开的。
只要有事可做,Dart 隔离就会保持活力。如果在 中启动异步计算main
,则隔离在main
完成后继续运行,等待计算完成。当没有进一步的计算运行时,程序结束。
AReceivePort
是一个可以从其他地方接收数据的端口。只要其中一个是打开的,隔离者就不知道它没有完成。一个新事件可能会到达ReceivePort
以触发更多计算。隔离器本身不知道是否有人SendPort
可以向其发送数据,它只是假设这是可能的。
因此,aReceivePort
使隔离和程序保持活动状态,因为程序不确定它还没有完成计算。这是好事。您可以创建一个新的隔离并让它等待一个上的命令,ReceivePort
而不会在它第一次空闲时关闭该隔离。
这确实意味着您需要在完成后关闭端口。
我相信由 ReceivePort 启动的线程(或 webworker)仍然存在,并且需要在整个应用程序退出之前显式关闭。尝试添加p.close()
,如果退出,那就解释了。