Sử dụng một ổ cắm nhắn tin ZMQ.SocketType.REP
(trả lời) với ZeroMQ, tôi nhận được tin nhắn và sau đó gửi lại tin nhắn "OK".Ổ cắm ZeroMQ Recv() ném 'Bối cảnh đã bị chấm dứt' ngoại lệ - tại sao và cách khôi phục?
Hiện tại, tôi đang thử địa phương này (gửi/nhận tin nhắn từ cùng một ứng dụng giao diện điều khiển C# chạy trên cùng một máy).
Khá thường xuyên (sau khoảng 1500 tin nhắn), các dòng:
var receivedBytes = _recvSocket.Recv();
... sẽ ném một ngoại lệ: Context was terminated
Câu hỏi của tôi là, tại sao điều này xảy ra, và làm thế nào để bạn phục hồi từ nó?
Tôi có một System.Threading.Thread
chuyên dụng để chạy của tôi "server-side" ZeroMQ reply ổ cắm, đây là vòng lặp mà nó chạy:
private static void MessagingLoopReceive(object state)
{
if (_zmqc == null)
{
_zmqc = new ZMQ.Context(1);
}
_recvSocket = _zmqc.Socket(ZMQ.SocketType.REP);
_recvSocket.Bind("tcp://*:5556");
while (true)
{
if (_queueStop)
{
break;
}
//Console.WriteLine("Server blocking for receive...");
var receivedBytes = _recvSocket.Recv();
if (receivedBytes != null && receivedBytes.Length > 0)
{
//Console.WriteLine("Server message received from client, sending OK");
_recvSocket.Send("OK", Encoding.ASCII);
//Console.WriteLine("Server OK sent, adding message to queue");
_queuedMessages.Enqueue(receivedBytes);
}
else
{
Thread.Sleep(1);
}
}
}
Bạn đã chính xác - ngữ cảnh được thiết lập theo cách mà GC can thiệp vào nó. Cảm ơn bạn!! – Brandon
Bạn có thể giải thích về điều này không? – Sergejus
Một cách khác là sử dụng 'GC.KeepAlive': http://msdn.microsoft.com/en-us/library/system.gc.keepalive(v=vs.90).aspx để ngăn chặn việc thu thập rác trên đối tượng. –