ZMQ.SocketType.REP
(返信)メッセージングソケットをZeroMQで使用すると、メッセージを受信して「OK」メッセージを戻しています。ZeroMQソケットRecv()は 'コンテキストが終了しました'例外をスローします - なぜ回復するのか?
今のところ、私はこれをローカル(同じマシン上で実行されている同じC#コンソールアプリからのメッセージの送受信)しようとしています。
かなり定期的(約1500メッセージの後に)、ライン:
var receivedBytes = _recvSocket.Recv();
は...例外がスローされます:Context was terminated
私の質問は、これはが起こるない理由で、 あなたはそれからどのように回復しますか?私は、「サーバー側」ZeroMQを実行専用System.Threading.Thread
はここで、ソケットを返信してい
は、それが動作することをループです:
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);
}
}
}
正しいです - GCが干渉しているようにコンテキストが設定されていました。ありがとうございました!! – Brandon
これについて詳しく教えていただけますか? – Sergejus
代わりに、GC.KeepAliveをhttp://msdn.microsoft.com/en-us/library/system.gc.keepalive(v=vs.90).aspxを使用してオブジェクトのガベージコレクションを防ぐこともできます。 –