Usando un socket de mensajes ZMQ.SocketType.REP
(respuesta) con ZeroMQ, recibo mensajes y luego envío un mensaje "OK".ZeroMQ socket Recv() arroja la excepción 'Contexto finalizado': ¿por qué y cómo recuperarlo?
Por ahora, estoy intentando esto localmente (enviando/recibiendo mensajes de la misma aplicación de consola C# ejecutándose en la misma máquina).
con bastante regularidad (después de alrededor de 1500 mensajes), la línea:
var receivedBytes = _recvSocket.Recv();
... será una excepción: Context was terminated
Mi pregunta es, ¿por qué sucede esto, y ¿cómo te recuperas de él?
Tengo un System.Threading.Thread
dedicada a la ejecución de mi "del lado del servidor" ZeroMQ responder zócalo, aquí es el bucle que se ejecuta:
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);
}
}
}
Tiene razón: el contexto se configuró de manera que el GC estaba interfiriendo con él. ¡¡Gracias!! – Brandon
¿Podrías por favor dar más detalles sobre esto? – Sergejus
Una alternativa es usar 'GC.KeepAlive': http://msdn.microsoft.com/en-us/library/system.gc.keepalive(v=vs.90).aspx para evitar la recolección de basura en el objeto. –