1

フレームの送信時にブロックされている単一のソケットがあり、ポーラー (およびそれに関連するすべてのもの) を破棄したいと考えています。ただし、私にはできません。ソケットで 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 でテスト済み。

4

1 に答える 1