我正在尝试从隔离列表中获取答案。我写了下一个代码。问题,它不起作用。只是等待。
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");
}
答案 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
找到不同之处