1

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

发送帧方法

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

然后稍后,我会简单地打电话

mainSendSocket?.SendFrame(...);

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

轮询器和 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只要可以发送消息,即使无事可做,事件也会一直运行,但在这个特定区域有点缺乏文档。


我不确定我能在这里做什么,理想情况下,我想确定第一种情况下发生延迟的原因,但欢迎使用第二种方法甚至更好的第三种方法来解决 CPU 使用率问题。

4

1 回答 1

0

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

于 2017-01-18T22:18:03.063 回答