0

我正在尝试从 Isolate 作为列表中获得答案。我写了下一个代码。问题是它不起作用。这只是等待。

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");
}
4

2 回答 2

1

receivePort一个流。当您调用toList流时,它会等待流完成。这永远不会发生,所以toList通话永远停止。

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

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

于 2019-07-12T12:19:02.333 回答
0

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

代替

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

尝试

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

您可以在这里找到与 listen 和 await 的区别

于 2019-08-13T08:43:36.653 回答