4

如果您使用多个线程通过套接字发送数据,建议使用 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);
    }
}

现在到我的第二个问题。我检查了队列实现,发现它只是在底层对套接字的发送方法周围使用了一个锁。那么我为什么要使用 NetMQQueue,如果我也可以简单地在我的发送方法周围使用锁,从而减少额外对套接字的开销?

public void Send(NetMQMessage data) {
    lock (lockobj) {
        client.SendMultipartMessage(data);
    }
}

我知道,按照文档,我应该为每个线程添加一个额外的 inproc-Router 套接字和一个 DEALER,以同步传出调用。但与自己处理同步相比,我有点害怕开销太大。我希望我的应用程序中有多达 20 个通信线程,双向异步通信。

通讯图

4

0 回答 0