2

例如:

import 'dart:isolate';

void main() { var p = new ReceivePort(); }

这将使整个 VM 挂起,直到我 Ctrl-C 它。为什么是这样?

4

3 回答 3

3

Dart 的main功能运作方式与其他平台略有不同。它更像是一个“初始化”,而不是其他任何东西。它可以退出并且应用程序可以继续运行。如果 Dart VM 应用程序正在侦听事件,它就会保持活动状态。这通常意味着一个或多个 open Stream。AReceivePort是一个Stream。关闭此流将终止应用程序。

您可以通过运行此脚本dart --observe script.dart并在 Observatory 中查看应用程序来验证这一点。你会注意到你有一个隔离,它是“空闲的”——这意味着有开放的端口正在等待消息。您可以单击隔离面板中的“查看端口”,这ReceivePort将是列表中的唯一项目。一般来说,如果您挂起并且无法弄清楚原因,请启动 Observatory 并检查哪些端口是打开的。

于 2017-05-08T03:04:14.383 回答
3

只要有事可做,Dart 隔离就会保持活力。如果在 中启动异步计算main,则隔离在main完成后继续运行,等待计算完成。当没有进一步的计算运行时,程序结束。

AReceivePort是一个可以从其他地方接收数据的端口。只要其中一个是打开的,隔离者就不知道它没有完成。一个新事件可能会到达ReceivePort以触发更多计算。隔离器本身不知道是否有人SendPort可以向其发送数据,它只是假设这是可能的。

因此,aReceivePort使隔离和程序保持活动状态,因为程序不确定它还没有完成计算。这是好事。您可以创建一个新的隔离并让它等待一个上的命令,ReceivePort而不会在它第一次空闲时关闭该隔离。

这确实意味着您需要在完成后关闭端口。

于 2017-05-08T07:39:47.013 回答
2

我相信由 ReceivePort 启动的线程(或 webworker)仍然存在,并且需要在整个应用程序退出之前显式关闭。尝试添加p.close(),如果退出,那就解释了。

于 2017-05-06T15:16:14.683 回答