ZMQ NetMQ - 无法完成非阻塞套接字操作
ZMQ NetMQ - A non-blocking socket operation could not be completed
我有以下模式:
多个线程正在将消息发送到由单线程 Dealer 轮询的 ConcurrentQueue,以便将消息发送到 Router。
发送多条消息时出现以下异常:
"SocketException - A non-blocking socket operation could not be
completed"
这是将消息出队并将其发送给经销商的线程代码:
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 大小 and/or SendHighWatermark 大小,但我仍然遇到相同的错误。
我是否需要处理此异常并重置套接字,或者在这种情况下我不应该这样做?
dealerSocket 在 2 个线程中使用:main 和 poller。
为了仅在一个线程中使用 dealerSocket,我们使用了 NetMQQueue。
更多详情here
我有以下模式:
多个线程正在将消息发送到由单线程 Dealer 轮询的 ConcurrentQueue,以便将消息发送到 Router。
发送多条消息时出现以下异常:
"SocketException - A non-blocking socket operation could not be completed"
这是将消息出队并将其发送给经销商的线程代码:
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 大小 and/or SendHighWatermark 大小,但我仍然遇到相同的错误。
我是否需要处理此异常并重置套接字,或者在这种情况下我不应该这样做?
dealerSocket 在 2 个线程中使用:main 和 poller。 为了仅在一个线程中使用 dealerSocket,我们使用了 NetMQQueue。
更多详情here