一个非阻塞套接字操作无法完成

本文关键字:操作 套接字 一个 | 更新日期: 2023-09-27 18:06:57

我有以下模式:

多个线程向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大小,但我仍然有相同的错误。

我是否需要处理这个异常并重置套接字,或者我不应该在这种情况下?

一个非阻塞套接字操作无法完成

dealerSocket在两个线程中使用:main &轮询器。为了只在一个线程中使用dealerSocket,我们使用了NetMQQueue。

更多细节在这里