我一直在玩Dart Isolates并使用isolate.pause();
函数遇到问题。
import 'dart:io';
import 'dart:isolate';
main(){
ReceivePort receivePort = new ReceivePort();
Isolate.spawn(isolateEntryPoint, receivePort.sendPort).then((isolate){
isolate.pause(isolate.pauseCapability);
});
}
void isolateEntryPoint(SendPort sendPort){
while(true){
print("isolate is running");
sleep(new Duration(seconds: 2));
}
}
在我的例子中,隔离基本上只是每2秒打印一次。
从我在docs上看到的内容,我的理解是上面的代码应该:
但它不起作用,隔离仍然在运行并且每隔2秒打印一次“隔离正在运行”,即使我告诉它暂停。
我知道您可以通过传入paused: true
可选参数启动处于暂停状态的隔离:
Isolate.spawn(isolateEntryPoint, receivePort, paused: true)...
。但最终我希望能够在任何时候暂停隔离,而不仅仅是蝙蝠。
我可以找到关于使用它的唯一文档是在官方dart文档上,所以我可能错误地使用了isolate.pause()
函数。但无论哪种方式,都会非常感谢演示正确使用此函数的代码示例。
答案 0 :(得分:5)
你说的没错,这是不正常的。
隔离暂停功能通过暂停事件队列来工作。当前正在执行的事件将完成,然后在您恢复隔离之前不会处理任何其他事件。暂停不会影响正在运行的代码。
在此代码中,隔离入口点正在运行具有内置延迟的无限循环。它永远不会返回事件队列。如果您在循环中安排了任何异步操作,它们将永远不会执行。 sleep
原语睡眠整个孤立,但它与完全没有任何不同(它只需要更长时间)。
您尝试“立即暂停”新隔离,但隔离并发运行,并且在返回Isolate
对象时,新隔离已经开始执行其入口点函数。
如果我们不再需要支持编译为JavaScript的隔离,那么将来可能会更改隔离功能,更加急于处理控制消息,但是当前隔离控制消息实际上是异步的,它们是仅在Dart事件队列的事件之间生效。