5

マルチスレッドアプリケーションをクリーンな方法で終了するための最良の方法は何ですか?
別々のソケットでメインスレッドからいくつかのソケット接続を開始し、メインスレッドで営業日の終わりまで待って、現在System.Environment.Exit(0)それを終了するために使用しています。

これにより、子の1つで未処理の例外が発生します。リストからスレッドを停止する必要がありますか?私はまだ子供たちに実際の停止を実装することを躊躇しているので、ベストプラクティスについて疑問に思っています。ソケットはすべて、ログアウトして閉じるための適切なデストラクタで適切にラップされていますが、それでもエラーが発生します。

4

3 に答える 3

4

マルチスレッドに関する jon skeet の記事をご覧ください。

http://www.yoda.arachsys.com/csharp/threads/

特に「ワーカースレッドを正常にシャットダウンする」:

http://www.yoda.arachsys.com/csharp/threads/shutdown.shtml

于 2010-03-12T14:36:34.960 に答える
2

手動で作成されたスレッドの場合、IsBackgroundプロパティを true に設定する必要があります。この場合 (メイン スレッドを除くすべてのスレッド) がバックグラウンドになる場合、アプリケーションは Main(string[] arg) 関数から戻った後に正常に閉じられます。

PS すべてのスレッド プールのスレッドはバックグラウンドです。

于 2010-03-12T15:35:04.730 に答える
0

長いブロック待機 (着信接続の待機など) を行うときは常に、メソッドの Begin/End 形式を使用します。次に、ManualResetEvent を使用して、「終了する必要がある」状態を表します。次に、AsyncWaitHandle と exit イベントでブロックします。これにより、きれいに終了できます。

例:

// exit is a ManualResetEvent
var asyncResult = socket.BeginAccept(null, null);
if(WaitHandle.WaitAny(new[] { exit, asyncResult.AsyncWaitHandle }) == 0)
   return;
var connection = socket.EndAccept(asyncResult);

そして、終了したいときのメインメソッドで:

exit.Set();
于 2010-03-12T15:39:14.037 に答える