e.g:
import 'dart:isolate';
void main() { var p = new ReceivePort(); }
这将使整个VM挂起,直到我按Ctrl-C它。这是为什么?
答案 0 :(得分:3)
Dart的main
功能与其他平台的运行方式略有不同。它更像是一个初始化的'比什么都重要;它可以退出,应用程序可以继续运行。如果Dart VM应用程序正在侦听事件,它将保持活动状态。这通常意味着一个或多个开放Stream
。 ReceivePort
是Stream
。关闭此流将终止该应用程序。
您可以通过使用dart --observe script.dart
运行此脚本并在Observatory中查看应用程序来验证这一点。您会注意到您有一个隔离区,并且它处于空闲状态' - 这意味着有正在等待消息的端口打开。您可以点击“查看端口'在隔离面板中,ReceivePort
将是列表中唯一的项目。一般来说,如果你挂了,你无法弄清楚原因,请启动天文台并检查哪些港口是开放的。
答案 1 :(得分:2)
我相信ReceivePort启动的线程(或webworker)仍然存在,需要在整个应用程序退出之前显式关闭。尝试添加p.close()
,如果退出,则说明了这一点。