我一直在玩飞镖分离物 https://api.dartlang.org/stable/1.24.3/dart-isolate/Isolate-class.html并在使用时遇到了问题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));
}
}
在我的示例中,isolate 基本上每 2 秒打印一些内容。
从我读到的docs https://api.dartlang.org/stable/1.24.3/dart-isolate/Isolate/pauseCapability.html,我的理解是上面的代码应该:
- 产生一个隔离体
- 立即暂停该隔离
但它不起作用,隔离仍在运行,并且每 2 秒打印一次“隔离正在运行”,即使在我告诉它暂停之后也是如此。
我知道你可以start通过传入处于暂停状态的隔离paused: true
可选参数:Isolate.spawn(isolateEntryPoint, receivePort, paused: true)...
。但最终我希望能够在任何时候暂停隔离,而不仅仅是立即暂停。
我能找到的关于使用它的唯一文档是官方的 dart 文档,所以我可能正在使用isolate.pause()
功能不正确。但无论哪种方式,演示该函数的正确用法的代码示例都将受到极大的赞赏。
您是对的,这没有按您的预期工作。
隔离暂停功能的工作原理是暂停事件队列。当前正在执行的事件将完成,然后在恢复隔离之前不会处理进一步的事件。暂停不会影响正在运行的代码。
在此代码中,隔离入口点正在运行具有内置延迟的无限循环。它永远不会返回到事件队列。如果您在循环中安排任何异步操作,它们将永远不会执行。这sleep
Primitive 会休眠整个隔离,但这与什么都不做没有什么不同(只是需要更长的时间)。
您尝试“立即暂停”新的isolate,但是isolates同时运行,并且当Isolate
对象被返回。
如果我们不再需要支持编译为 JavaScript 的隔离,将来可能会更改隔离功能,以便更热心地处理控制消息,但目前隔离控制消息实际上是异步的,它们只会生效Dart 事件队列的事件之间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)