从NetMQQueue /同步消息中取出物品的正确方法

时间:2017-01-18 21:19:45

标签: c# netmq

如果您使用多个线程通过套接字发送数据,建议使用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个通信线程,双向异步通信。

communication diagram

0 个答案:

没有答案