当没有通过 ZMQ 接收到数据时应用程序冻结

Application freezes when no data is being received via ZMQ

我正在使用以下代码接收帧字符串。

private SubscriberSocket subSocket;
 void Start()
 {
     subSocket = new SubscriberSocket();

     subSocket.Connect("tcp://localhost:5555");
 }

 void Update()
 {
     string data = subSocket.ReceiveFrameString();

 }

此代码的问题在于,当未从客户端接收到任何数据时,统一应用程序会冻结。当没有收到任何数据时,如何阻止应用程序冻结?

ReceiveFrameString 等方法将无限期阻塞,直到收到消息。有几种方法可以处理这个问题,这可能取决于您使用的库。请注意,ZeroMq 是一个 协议 ,而我所知道的 .net 库是 clrzmq 和 NetMq。

在后台线程上执行调用。启动仅接收消息的 longRunning 任务。一旦收到,您就可以在工作线程上处理它们,启动另一个任务,或者将它们放在主线程处理的队列中。我不是 100% 了解 unity 中的线程模型是如何工作的。

为调用添加超时。应该有一个重载,它接受等待多长时间的值。您应该能够给出一个低值,或者为零表示不等待。请注意,缓冲的消息数量可能会受到限制。

使用异步调用。至少像 NetMq 这样的库有 async receive calls 应该可以用来避免阻塞。