各コールバックで複数のスレッドを生成する 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 がこれを達成するのに役立つようです: