1

我有单个套接字,它在发送帧时被阻止,我想处理轮询器(以及与之相关的所有内容)。但是,我做不到——在套接字上调用 dispose 会引发异常,而在 poller 上调用 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 进行了测试。

4

1 回答 1

1

1 ) 始终归零ZMQ_LINGER总是。就在socket实例化时,以防止对优雅终止{ .close() | .term() }操作的其他无意阻塞(无论是终止操作的受控或非受控激活(正如您已经面对的那样))。

2)避免阻塞设计。原则上。每个阻塞状态都会创建一个状态,在这种状态下,您的所有代码都会失控。知道了?

于 2017-07-14T10:45:44.193 回答