Flutter 如何与在Dart/颤振中执行阻塞操作的隔离装置进行通信?

Flutter 如何与在Dart/颤振中执行阻塞操作的隔离装置进行通信?,flutter,dart,dart-isolates,Flutter,Dart,Dart Isolates,在一个桌面颤振应用程序(linux)的工作中,我需要在一个孤立的环境中执行一些密集的计算任务。但是,当这个隔离执行这个长操作时,它并没有读取传入的消息(这似乎是合乎逻辑的)。 我希望在它表演时仍然能够与它交流 ReceivePort-rPort; 森波特体育; 隔离; void main(){ rPort=ReceivePort(); 隔离=等待隔离.spawn(入口点,receivePort.sendPort); sPort=先等待rPort; sendMessage(“perform”);/

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

ReceivePort-rPort;
森波特体育;
隔离;
void main(){
rPort=ReceivePort();
隔离=等待隔离.spawn(入口点,receivePort.sendPort);
sPort=先等待rPort;
sendMessage(“perform”);//正在处理此问题
sendMessage(“controlMessage”);//这是在执行结束后处理的
}
无效发送消息(字符串消息){
ReceivePort localReceivePort=ReceivePort();
sendPort.send([msg,localReceivePort.sendPort]);
}
无效入口点(发送端口发送端口)
{
ReceivePort ReceivePort=ReceivePort();
sendPort.send(receivePort.sendPort);
receivePort.listen((消息){
字符串数据=消息[0];
SendPort reply=msg[1];
打印(数据);
如果(数据==“执行”)执行锁定操作();
如果(数据==“controlMessage”)controlPerformance();
repy.发送(“某物”);
});
}
我尝试了很多选择:使performBlockingOperation异步,但这似乎不起作用。 即使尝试在隔离内部创建本机线程,也会返回

../../third_party/dart/runtime/vm/runtime_entry.cc:3331:错误: 无法在隔离外部调用本机回调


有没有办法实现我正在努力的目标

使计算异步化是正确的第一步。 第二步是在计算过程中,在某些点进行实际屈服控制


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

谢谢您的回答。我不知道第二步该怎么做。这是关于收益率报表的吗?它是否在性能功能或控制(主隔离)内?不需要
yield
语句。
await
语句应该在“performance function”中,即正在运行并阻止隔离执行任何其他操作的代码。通过在代码中添加一个延迟,一个足够长的延迟,允许事件循环检查其他事件,您可以确保其他代码也有机会运行。“我希望在它执行时仍然能够与它通信。”-需要明确的是:您希望在
隔离中处于某个大的计算循环中,并且仍然能够接收传入消息?或者你想在一个“大计算任务循环”完成后得到下一个排队的消息?第一个选项,我想在隔离的某个大计算循环中,仍然接收传入消息。好吧,这是不可能的,除非你在循环中添加一些检查点来检查是否有新消息到达-但我真的怀疑你能做到这一点(或者你可以?)是的,我可以,长计算函数只是一个长循环。我可以在循环中放入我想要的任何东西。因此,在你的循环中添加
等待未来((){});
接收端口的一些机会。listen()
来完成它的工作