如果您使用多个线程通过套接字发送数据,建议使用NetMQQueue来同步这些请求。
我已将队列附加到轮询器,我正在接收queue.ReceiveReady
个事件。但在这种情况下,我可以访问底层的ConcurrentQueue实例。但是我不知道如何处理这个队列,我应该只拿一个项目还是我应该尝试清空它?
//Should I dequeue one item
private static void Queue_ReceiveReady(object sender, NetMQQueueEventArgs<NetMQMessage> e) {
var item = e.Queue.Dequeue();
socket.SendMultipartMessage(message);
}
//or all items available
private static void Queue_ReceiveReady(object sender, NetMQQueueEventArgs<NetMQMessage> e) {
NetMQMessage message;
while (e.Queue.TryDequeue(out message, TimeSpan.FromMilliseconds(10))) {
socket.SendMultipartMessage(message);
}
}
现在回答我的第二个问题。我检查了queue implementation并看到它只是在底层对套接字的send方法周围使用了一个锁。那么我为什么要使用NetMQQueue,如果我只是在我的send方法中使用一个锁,减少额外的一对套接字的开销呢?
public void Send(NetMQMessage data) {
lock (lockobj) {
client.SendMultipartMessage(data);
}
}
我知道,按照文档,我应该为每个线程添加一个额外的inproc-Router套接字和一个DEALER,以同步传出的调用。但与我自己处理同步相比,我有点害怕有太多的开销。我希望我的应用程序中有多达20个通信线程,双向异步通信。