如何关闭receivePort以使.toList()方法正常工作?

时间:2019-07-12 11:29:17

标签: dart dart-isolates

我正在尝试从隔离列表中获取答案。我写了下一个代码。问题,它不起作用。只是等待。

main() async
{
  ReceivePort receivePort = ReceivePort();
  Isolate.spawn(echo, receivePort.sendPort);

  var d = await receivePort.toList();
  receivePort.close();
  print(d);
}

echo(SendPort sendPort) async
{
  ReceivePort receivePort = ReceivePort();
  sendPort.send("message");
}

2 个答案:

答案 0 :(得分:1)

receivePort是流。当您在流上调用toList时,它将等待流完成。这种情况永远不会发生,因此toList呼叫将永远停滞。

如果您知道通信的另一端仅发送一条消息,则可以改为执行var d = await receivePort.first;。这只会等待第一条消息。

通常,在进行隔离通信时,发送隔离应该在完成隔离后发送特殊消息,因为接收隔离没有其他方法可以知道。也就是说:您需要一个通信协议,以便接收者可以知道是否还会有更多消息。也许每个消息都是一个包含isLast布尔值的对象,或者最后一条消息是null,或者您将所有消息包装在定义协议的Message类的子类中。做什么取决于实际用例。 唯一的规则是:完成时您必须说。

答案 1 :(得分:0)

如果要在关闭流之前查看列表的输出,则应使用 .listen()而不是 await for 。侦听将注册处理程序,并且执行继续。

代替

  var d = await receivePort.toList();
  receivePort.close();
  print(d);

尝试

receivePort.listen((data) => {print(data)});

您可以通过监听和等待here

找到不同之处