为什么创建单个ReceiverPort会导致Dart VM挂起?

时间:2017-05-06 00:57:16

标签: dart dart-isolates

e.g:

import 'dart:isolate';

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

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

2 个答案:

答案 0 :(得分:3)

Dart的main功能与其他平台的运行方式略有不同。它更像是一个初始化的'比什么都重要;它可以退出,应用程序可以继续运行。如果Dart VM应用程序正在侦听事件,它将保持活动状态。这通常意味着一个或多个开放StreamReceivePortStream。关闭此流将终止该应用程序。

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

答案 1 :(得分:2)

我相信ReceivePort启动的线程(或webworker)仍然存在,需要在整个应用程序退出之前显式关闭。尝试添加p.close(),如果退出,则说明了这一点。