当没有通过 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 应该可以用来避免阻塞。
我正在使用以下代码接收帧字符串。
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 应该可以用来避免阻塞。