使用Dart Isolate后已杀死实例,为何仍需调用exit(0)退出程序?
问题原因解析
你遇到的问题本质是Dart进程的生命周期规则导致的,核心原因如下:
- Dart进程不会自动退出的前提是:当前任意Isolate中还存在未关闭的活跃
ReceivePort实例,ReceivePort属于持续监听的异步事件源,只要它处于打开状态,Dart的事件循环就会保持运行等待接收新消息,进程不会自动终止。 - 你在main函数中创建的
receiverPort = ReceivePort()全程没有调用close()方法关闭,哪怕你已经销毁了子Isolate,main Isolate自身仍然持有这个打开的ReceivePort,所以进程会一直挂起不会结束。 exit(0)的作用是强制终止整个Dart进程,忽略所有未处理的事件源和异步任务,所以调用后可以直接退出程序。
最优解决方案
不需要强制调用exit(0),只需要在销毁子Isolate后主动关闭你创建的ReceivePort即可,修改后的代码如下:
import 'dart:io'; import 'dart:isolate'; Isolate? isolate; void printX(SendPort sendPort) { print(sendPort); } void main() async { var receiverPort = ReceivePort(); isolate = await Isolate.spawn(printX, receiverPort.sendPort); isolate!.kill(priority: Isolate.immediate); // 主动关闭ReceivePort,进程检测到无活跃事件源后会自动退出 receiverPort.close(); }
内容的提问来源于stack exchange,提问作者SUNNY PAUL
相关产品推荐
相关产品推荐

