私は C# で記述された Windows サービスを持っています。これは、大量のスレッドを作成し、多くのネットワーク接続 (WMI、SNMP、単純な TCP、http) を作成します。サービス MSC スナップインを使用して Windows サービスを停止しようとすると、サービスを停止するための呼び出しは比較的迅速に返されますが、プロセスは約 30 秒間実行され続けます。
主な問題は、停止するのに 30 秒以上かかる理由は何かということです。何を探すことができ、どのように探すのですか?
2 つ目の質問は、プロセスがまだ実行されているにもかかわらず、サービス msc スナップイン (サービス コントローラー) が返される理由です。プロセスが実際に強制終了されたときにのみ返されるようにする方法はありますか?
サービスの OnStop メソッドのコードは次のとおりです。
protected override void OnStop()
{
//doing some tracing
//......
//doing some minor single threaded cleanup here
//......
base.OnStop();
//doing some tracing here
}
スレッドのクリーンアップの回答に応じて編集する
あなたの多くは、すべてのスレッドを追跡してからクリーンアップする必要があると答えました。私はそれが実際的なアプローチだとは思わない。まず、1 つの場所にあるすべてのマネージド スレッドにアクセスできません。このソフトウェアは、さまざまなコンポーネント、プロジェクト、さらにはスレッドを作成している可能性のあるサードパーティの DLL を含む非常に大きなものです。それらすべてを 1 つの場所で追跡したり、すべてのスレッドがチェックするフラグを保持したりする方法はありません (すべてのスレッドにフラグをチェックさせることができたとしても、多くのスレッドがセマフォなどでブロックしています。ブロックしているときは、チェックしないでください。タイムアウトで待機させてから、このグローバル フラグをチェックして再度待機する必要があります)。
IsBackround フラグは興味深いチェック項目です。繰り返しますが、フォアグラウンド スレッドが実行されているかどうかを確認するにはどうすればよいでしょうか。スレッドを作成するコードのすべてのセクションをチェックする必要があります。他の方法はありますか、これを見つけるのに役立つツールかもしれません。
ただし、最終的には、プロセスは停止します。何かを待つ必要があるようにしか思えません。ただし、OnStop メソッドで X 時間待機すると、プロセスが停止するまでに約 30 秒 + X かかります。私が何をしようとしても、プロセスが実際に停止するために OnStop が戻った後、プロセスには約 30 秒 (常に 30 秒ではなく、変化する可能性があります) が必要なようです。