ZMQ NetMQ - 无法完成非阻塞套接字操作

时间:2016-09-14 17:31:01

标签: c# sockets zeromq netmq

我有以下模式:

Multiples线程正在向ConcurrentQueue发送消息,该消息由单个线程经销商轮询,以便将消息发送到路由器

发送多个邮件时会引发以下异常:

  

“SocketException - 无法执行非阻塞套接字操作   完成了“

以下是将消息出列并将其发送给经销商的线程代码:

Task.Factory.StartNew((state) =>
        {
            using (NetMQSocket dealerSocket = new DealerSocket(_connectionString))
            using (NetMQPoller poller = new NetMQPoller() { dealerSocket })
            {
                dealerSocket.ReceiveReady += DealerSocketOnReceiveReady;
                poller.RunAsync();

                while (true)
                {
                    Message<T> message;
                    if (!_concurrentQueue.TryDequeue(out message)) continue;

                    _pendingRequests.Add(message.Id, message);
                    var mpm = new NetMQMessage(4);
                    mpm.AppendEmptyFrame();
                    mpm.Append(message.Body);
                    mpm.AppendEmptyFrame();
                    mpm.Append(message.Id.ToString());
                    dealerSocket.SendMultipartMessage(mpm);
                }
            }
        }, TaskCreationOptions.LongRunning, _cancellationTokenSource.Token);

发送MultipartMessage

时发生SocketException

我试图增加SendBuffer大小和/或SendHighWatermark大小,但我仍然有同样的错误。

我是否需要处理此异常并重置套接字,否则我永远不应该处于这种情况?

1 个答案:

答案 0 :(得分:0)

dealerSocket用于2个主题:main&amp;轮询。 为了仅在一个线程中使用dealerSocket,我们使用了NetMQQueue。

更多详情here