【问题标题】:ZMQ NetMQ - A non-blocking socket operation could not be completedZMQ NetMQ - 无法完成非阻塞套接字操作
【发布时间】:2016-09-21 16:41:06
【问题描述】:

我有以下模式:

多个线程正在向 ConcurrentQueue 发送消息,该 ConcurrentQueue 由单线程 Dealer 轮询,以便将消息发送到 Router。

发送多条消息时会引发以下异常:

"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 大小,但仍然遇到同样的错误。

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

【问题讨论】:

    标签: c# sockets zeromq netmq


    【解决方案1】:

    dealerSocket 用于 2 个线程:main 和 poller。 为了只在一个线程中使用dealerSocket,我们使用了NetMQQueue。

    更多详情here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      相关资源
      最近更新 更多