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