C# 如何处理套接字被阻塞的轮询器?

C# 如何处理套接字被阻塞的轮询器?,c#,zeromq,dispose,netmq,C#,Zeromq,Dispose,Netmq,我有一个套接字,它在发送帧时被阻止,我想处理轮询器(以及与之相关的所有内容)。然而,我不能这样做——在套接字上调用dispose会引发异常,而在轮询器上调用dispose会完全阻塞 请注意,我使用的是SendFrame,我可以使用TrySendFrame,但本示例的目的是实际阻止套接字并找到一种方法来清理所有内容 例如: private Program() { const string address = "tcp://localhost:5000"; var socket =

我有一个套接字,它在发送帧时被阻止,我想处理轮询器(以及与之相关的所有内容)。然而,我不能这样做——在套接字上调用dispose会引发异常,而在轮询器上调用dispose会完全阻塞

请注意,我使用的是
SendFrame
,我可以使用
TrySendFrame
,但本示例的目的是实际阻止套接字并找到一种方法来清理所有内容

例如:

private Program()
{
    const string address = "tcp://localhost:5000";

    var socket = new DealerSocket();
    socket.Options.SendHighWatermark = 1;
    socket.Options.Identity = Encoding.ASCII.GetBytes(Guid.NewGuid().ToString("N"));
    socket.Connect(address);

    var poller = new NetMQPoller();
    poller.Add(socket);
    socket.SendReady += OnSendReady;
    poller.RunAsync();

    Thread.Sleep(5000);
    Console.WriteLine("Disposing");
    poller.Dispose(); // get stuck on this one
    Console.WriteLine("Disposed");
}

private void OnSendReady(object sender, NetMQSocketEventArgs e)
{
    Console.WriteLine("0");
    e.Socket.SendFrame("hello");
    Console.WriteLine("1");
    e.Socket.SendFrame("hello"); // this will block
    Console.WriteLine("2");
}
使用NetMQ 3.3.3.4(目前我的主要版本)和4.0.0.1进行测试。

1)始终将
ZMQ\u LINGER
归零始终。正好在
套接字
实例化上,以防止在正常终止时意外阻塞
{.close()|.term()}
操作(无论是受控激活还是非受控激活终止操作(正如您已经面对的那样))


2)避免阻塞设计主要是。每个阻塞状态都会创建一个状态,在该状态下,所有代码都会失控。明白了吗?

谢谢,但是AFAIK
Linger
默认为零。现在,我想知道轮询器在发生这种冲突时抛出异常(比如套接字)是否更好。无论如何,这解决了我的问题。自ZeroMQ诞生以来,ZMQ_LINGER在默认情况下不是零。是的,最近的API改变了这一点,但是专业的分布式系统设计应该明确显示所有的注意事项(谁知道您的代码将在哪里运行&在所有远程本地主机上实际会出现什么API版本,这在您的可强制执行{version | release | configuration}区域之外是毫无疑问的)-管理控制程序,对吗?旧的汇编程序源代码有一个很好的实践,总是从#假设没有;o)开始