我尝试使用isolate.addOnExitListener(...)跟踪隔离当前是否正在运行(以及将来是否出错)。然而,下面的代码片段并没有像我期望的那样工作:
items.forEach((name, item) async {
Isolate isolate = await Isolate.spawnUri(...);
item.status = "running";
ReceivePort receivePort = new ReceivePort();
isolate.addOnExitListener(receivePort.sendPort);
receivePort.listen((message){
if (message == null) {
print("Item exited: ${item.name}");
item.status = "stopped";
}
});
});
“items”Map包含3个值,每个值都有一个不同的名称:项目1、项目2、项目3
当我运行这段代码时,我得到的唯一输出是:“物品退出:项目3”
我期望以下输出(不一定按顺序,因为分离株是异步的):“物品退出:item 1”“项目已退出:item 2”“项目已退出:项目3”
以下是在分离菌株中运行的代码:
import 'dart:io';
main(List args) {
print('Hello world: standard out!');
stderr.writeln('Hello world: standard error!');
}
似乎封闭正在消失。我做错什么了吗?有没有更好的方法来跟踪分离株的状态?
先谢谢你了!
2条答案
按热度按时间nhhxz33t1#
如果您想绝对确保在隔离的任何代码执行之前可以在隔离中安装onExit和onError侦听器,那么您可以生成暂停的隔离。请参阅有关spawnUri的文档。
下面是一个例子:
一旦注册了适当的监听器,就可以使用resume启动新创建的分离菌株。
这与初始握手的建议非常相似,但在本例中,它是库内置的。
ippsafx72#
当分离株没有任何值得注意的行为(只有一条打印语句)时,我也有同样的行为。它似乎在注册
onExitListener
之前退出。onExitListener
的dartdoc说隔离代码
随着额外的延迟,我得到了期望的退出通知。延迟需要相当高:-(。
您可以进行一些初始握手,以确保在所有设置正确之前,隔离菌株不会退出