使用NetMQ / ZMQ C#消息发送的奇怪延迟

时间:2016-03-07 15:32:05

标签: c# .net asynchronous zeromq netmq

我正在尝试通过ZeroMQ PublisherSocket发送消息,但我似乎无法做到正确。我尝试了两种不同的方法,但都有自己的问题。

SendFrame方法

PublisherSocket mainSendSocket = context.CreatePublisherSocket();
mainSendSocket.Connect(...);

然后,我会打电话给

mainSendSocket?.SendFrame(...);

这就是我期望事情能够发挥作用的方式,但问题是我发现有时候在按下WinForms应用程序按钮和实际发送消息之间会出现明显的延迟。我知道这是因为我正在控制一些自定义硬件并立即得到反馈。

Poller和SendReady事件

此方法没有任何延迟,但会导致应用程序使用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使用率解决方案甚至是更好的第三种方法欢迎。

1 个答案:

答案 0 :(得分:0)

您应该能够使用NetMQQueue来处理来自多个线程的消息。将其附加到轮询器而不是套接字,一旦将数据添加到队列中,它就会调用ReceiveReady事件。然后,您可以直接调用发布服务器的发送方法。