3

NetworkstreamRead呼び出しでブロックしているスレッドがあります。このスレッドを中止するにはどうすればよいですか?別のスレッドからスレッドを呼び出しThread.Abortてみましたが、MSDNによるとThreadAbortException。ただし、ThreadAbortExceptionスレッドではまったく発生しません。ただし、ブロッキングRead呼び出しを削除して、スレッドをループに入れた場合です。これを行うための最良の方法は何ですか?呼び出しとイベントを同時に待機して、Readどちらかが発生した場合にスレッドのブロックを解除できますか?次に、別のスレッドからそのイベントを通知することができます。

4

3 に答える 3

3

ソケットを閉じてください!その後、読み取りは例外をスローする必要があります。

于 2012-08-04T11:36:51.093 に答える
2

Thread.Abortスレッドがマネージコードを実行している場合にのみ中止されますが、スレッドはアンマネージソケットで待機しているため、ソケットのブロックが解除されるまで何も起こりません。

ここでは、ソケットを閉じるのが最善のオプションです。

于 2012-08-04T12:32:09.950 に答える
1

セットする

stream.ReadTimeout = timeout; 
// timeout in ms

使用する前に

stream.Read(....

これにより、読み取りが強制的にタイムアウトになり、指定されたタイムアウト(ミリ秒単位)で何も読み取られない場合に何かを実行できるようになります。Stream::ReadTimeoutプロパティまたはMSDNのこの投稿を参照してください。このようにして、指定されたタイムアウトの間のみブロックする読み取りを実装できます。他の同期方法を使用して、読み取りを続行するか、スレッドを終了するかを決定します。タイムアウトは例外をスローします。

于 2012-08-04T16:19:00.597 に答える