5

我一直在玩Dart Isolatesisolate.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上阅读的内容,我的理解是上面的代码应该:

  1. 产生一个隔离
  2. 立即暂停隔离

但它不起作用,即使我告诉它暂停,隔离仍在运行,并且每 2 秒打印一次“隔离正在运行”。

我知道您可以通过传入可选参数 以暂停状态启动隔离: 。但最终,我希望能够在任何时候暂停隔离,而不是立即暂停。paused: trueIsolate.spawn(isolateEntryPoint, receivePort, paused: true)...

我能找到的关于使用它的唯一文档是官方 dart 文档,所以我可能isolate.pause()错误地使用了这个函数。但无论哪种方式,我们都将非常感谢演示此函数正确用法的代码示例。

4

1 回答 1

7

您是正确的,这没有按您的预期工作。

隔离暂停功能通过暂停事件队列来工作。当前执行的事件将完成,然后在您恢复隔离之前不会处理更多事件。暂停不影响正在运行的代码。

在这段代码中,isolate 入口点运行一个带有内置延迟的无限循环。它永远不会返回到事件队列。如果您在循环中安排了任何异步操作,它们将永远不会执行。原sleep语使整个隔离区都处于睡眠状态,但这与什么都不做没有什么不同(只是需要更长的时间)。

Isolate您尝试“立即暂停”新的隔离,但隔离同时运行,并且新的隔离在对象返回时已经开始执行其入口点函数。

将来可能会改变隔离功能,更渴望处理控制消息,如果我们不再需要支持编译为 JavaScript 的隔离,但目前隔离控制消息实际上是异步的,它们只会生效Dart 事件队列的事件之间。

于 2018-01-08T10:26:59.767 回答