如何与在Dart/Flutter中执行阻塞操作的隔离人员进行通信



在桌面颤振应用程序(linux(中,我需要在隔离中执行一些密集的计算任务。但是,当这个隔离执行这个长操作时,它并没有读取传入消息(这似乎是合乎逻辑的(。我希望在它表演的时候还能和它交流。

ReceivePort rPort;
SendPort sPort;
Isolate isolate;
void main() {
rPort = ReceivePort();
isolate = await Isolate.spawn(entryPoint, receivePort.sendPort);
sPort = await rPort.first;
sendMessage("perform"); // this is being processed
sendMessage("controlMessage"); // this is being processed after the perform has ended
}
void sendMessage(String msg) {
ReceivePort localReceivePort = ReceivePort();
sendPort.send([msg, localReceivePort.sendPort]);
}
void entryPoint(SendPort sendPort)
{
ReceivePort receivePort = ReceivePort();
sendPort.send(receivePort.sendPort);
receivePort.listen((message) {
String data = msg[0];
SendPort reply = msg[1];
print(data);
if(data == "perform") performBlockingOperation();
else if(data == "controlMessage") controlPerformance();
repy.send("something"); 
});
}

我尝试了很多选项:使performBlockingOperation异步,但这似乎不起作用。即使试图在隔离中创建本机线程也会返回

..//第三方/dart/runtime/vm/runtime_entry.cc:3331:错误:无法在隔离之外调用本机回调。

有办法实现我正在尝试的目标吗?

使计算异步是正确的第一步。第二步是在计算过程中的某些点实际产生控制。

然后在计算代码中插入一些await Future.delayed(Duration.zero);语句,这些语句会阻塞其他所有内容。计算不太深入,因为它确实会引入延迟,但通常情况下,您的隔离会有机会偶尔检查新事件。

最新更新