You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart程序何时确切终止?示例程序持续运行疑问解析

为什么你的Dart程序在输出42和100后仍不终止?

嘿,这个问题抓得很准!咱们来一步步搞清楚原因:

首先得明确Dart程序终止的核心规则:只有当所有Isolate都已退出,且没有活跃的ReceivePort(或其他未完成的异步任务/监听)时,Dart VM才会终止程序。

回到你的代码:

  • 子Isolate确实按预期完成了任务:等待1秒发送42,然后终止,触发退出监听器发送100。这两个消息都被主Isolate的ReceivePort接收并打印了。
  • 但问题出在主Isolate的ReceivePort上——它创建后一直处于活跃监听状态,Dart VM会默认认为可能还有后续消息要接收,所以不会主动终止程序。

要解决这个问题,你需要手动管理ReceivePort的生命周期,在确认不再需要接收消息时关闭它。比如,当收到子Isolate的退出信号(也就是100)时,调用port.close():

import 'dart:isolate';
Future<void> calculateTheAnswer(SendPort port) async {
  await Future.delayed(Duration(seconds: 1));
  port.send(42);
}
void main() async {
  var port = ReceivePort();
  port.listen((message) {
    print(message);
    // 收到退出消息后关闭ReceivePort
    if (message == 100) {
      port.close();
    }
  });
  await Isolate.spawn(calculateTheAnswer, port.sendPort)
    ..addOnExitListener(port.sendPort, response: 100);
}

修改后,当程序打印完100,ReceivePort被关闭,此时所有Isolate都已退出,也没有活跃的监听任务,Dart VM就会正常终止程序啦。

内容的提问来源于stack exchange,提问作者Marcel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:47:11