我正在尝试通过ZeroMQ PublisherSocket
发送消息,但我似乎无法做到正确。我尝试了两种不同的方法,但都有自己的问题。
PublisherSocket mainSendSocket = context.CreatePublisherSocket();
mainSendSocket.Connect(...);
然后,我会打电话给
mainSendSocket?.SendFrame(...);
这就是我期望事情能够发挥作用的方式,但问题是我发现有时候在按下WinForms应用程序按钮和实际发送消息之间会出现明显的延迟。我知道这是因为我正在控制一些自定义硬件并立即得到反馈。
此方法没有任何延迟,但会导致应用程序使用100%的一个CPU内核。 (50%的双核,25%的四核等)
PublisherSocket mainSendSocket = context.CreatePublisherSocket();
mainSendSocket.Connect(...);
poller = new Poller();
poller.AddSocket(mainSendSocket);
mainSendSocket.SendReady += mainSendSocket_SendReady;
然后在我的事件处理函数中,我将使用ConcurrentQueue来检查是否有任何要发送的消息,并使用相同的SendFrame
方法发送它们。当我想发送消息时,我必须将消息添加到队列中,以便下次运行时由事件处理程序拾取。
我知道CPU使用率的问题是因为即使没有任何事情可以发送消息,SendReady
事件也会继续运行,但documentation对此有点缺乏特定领域。
我不确定我能在这里做些什么,理想情况下我想确定第一种情况下发生延迟的原因,但第二种方法中的CPU使用率解决方案甚至是更好的第三种方法欢迎。
答案 0 :(得分:0)
您应该能够使用NetMQQueue来处理来自多个线程的消息。将其附加到轮询器而不是套接字,一旦将数据添加到队列中,它就会调用ReceiveReady事件。然后,您可以直接调用发布服务器的发送方法。