簡単に言えば、TimedOut 例外がキャッチされた後にソケットを再利用することは可能ですか? どうすればいいですか?
長い話:
2 つのスレッドがあり、どちらも同じソケットを使用しています。1つはリモートサーバーにパケットを送信し(スレッドAと呼びましょう)、もう1つ(スレッドB)は送信されたパケットの確認パケットをリッスンしています。スレッド A は、何らかの条件が満たされたときに ( で) 一時停止し、 aが続行するのをMonitor.Wait
待ちます。Monitor.Pulse
スレッド B がパケットを受信すると、それが呼び出さMonitor.Pulse
れ、スレッド A が引き続き処理を行います...
問題は、パケットが失われる可能性があり、スレッド A がパルスを待っている間に受信しないパケットをスレッド B が無期限に待機することです。プログラム全体が「ブロック」されます。私が最初に考えたのは、受信タイムアウトを設定し、関連する例外をキャッチすることでした。それが発生すると、Monitor.Pulse
スレッド B が別のパケットを待機している間、スレッド A を続行できます。
しかし、これはうまくいきません。例外がキャッチされると、スレッド A が同じソケットを使用しているため、スレッド A が新しいパケットを送信しようとすると、ソケットが閉じてアプリがクラッシュします。
この動作を防ぐにはどうすればよいですか?