7

各コールバックで複数のスレッドを生成する System.Threading.Timer を使用して、.NET 3.5 (c#) で記述された Windows サービスがあります。これらは単なる通常のスレッド (スレッド プールなし) であり、マネージ コードのみを実行するため、各スレッドでIsBackground = trueを設定しました。

ユーザーがサービスを停止すると、すべてのスレッドはどうなりますか? 彼らは優雅に死にますか?join または abort を呼び出してスレッドを管理するコードはありません。IsBackground = trueで、ユーザーがサービスを停止したときにスレッドが破棄されて停止すると仮定するのは正しいですか? 誰かが Service Manager GUI を介して Windows サービスを停止すると、正確にはどうなりますか? OnStop イベントを発生させた後、プロセスを強制終了しますか?

ユーザーがサービスを停止する前にスレッドがないことを確認できる別のメカニズムを構築したため、これは実際には受け入れられます。これは、Windows サービス内で実行される ServiceHost から公開される 2 つの WCF メソッドを介して行われます。新しいスレッドの生成を停止する 1 つの方法と、実行中のスレッドがいくつ残っているかを照会する別の方法があります。

これらの手順をスキップしてサービスを停止するとどうなるか興味があります... IsBackground がこれを達成するのに役立つようです:

4

1 に答える 1

7

あなたが提供したMSDNリンクから:

スレッドは、バックグラウンド スレッドまたはフォアグラウンド スレッドのいずれかです。バックグラウンド スレッドは、バックグラウンド スレッドがプロセスの終了を妨げないことを除いて、フォアグラウンド スレッドと同じです。プロセスに属するすべてのフォアグラウンド スレッドが終了すると、共通言語ランタイムはプロセスを終了します。残りのバックグラウンド スレッドはすべて停止され、完了しません。

スレッドのIsBackgroundプロパティを に設定すると、コールバックの実行が終了し、すべてのフォアグラウンド スレッド (存在する場合) が終了するとtrue、Windows サービスをすぐに終了できます。OnStop()バックグラウンド スレッドは実行状態になると停止されるため、これらのスレッドを正常に終了する必要がある場合は、別のメカニズムを使用する必要があります。

これを行う 1 つの方法はManualResetEvent、スレッドにシャットダウンを通知するオブジェクトをチェックするフォアグラウンド スレッドを使用することです。OnStop()コールバックで を設定し、ManualResetEventを使用してスレッドが終了するのを待ちますJoin()。妥当な時間内に終了しない場合は、プロセスが終了しているため、強制的に終了できます。

于 2010-05-08T17:42:48.347 に答える