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
相关产品推荐
相关产品推荐

