1

複数のスレッドを作成する C# で記述された Windows サービスがあり、一部のスレッドにはレガシー コードがあり、OnStop() が完了する前にこれらすべてのスレッドが停止するのを待つのに十分な時間/レガシー コードへのアクセスがありません。繰り返しになりますが、レガシーコードがあるため、すべてのスレッドへの参照がありません。ここで、サービスを動的に更新したいと考えています。そこで、Job サービスとは別の Updater サービスを開始します。アップデータ サービスはジョブ サービスを停止し、ジョブ サービス exe およびその他の dll をダウンロードし、これらを古いサービス exe および dll に置き換え、最後にジョブ サービスを再起動します。起動すると、Job サービスは Updater サービスを停止します。

アップデータ サービスが ServiceController.Stop() を使用してジョブ サービスを停止し、さらに ServiceController.WaitForStatus(ServiceControllerStatus.Stopped) を呼び出すと、ジョブ サービスは停止しますが、ジョブ サービスから生成された一部のレガシー スレッドはその時点で停止しない場合があります。その結果、ジョブ サービス exe を更新できません。

私は本当にまだ良い解決策を見つけていません。最善の解決策は、WaitHandles (AutoResetEvent/ManualResetEvent) を使用してすべてのスレッドが終了するのを待つことでしたが、これは発生していません。または、すべてのスレッドが強制的に中止された可能性もありますが、これも重要なようです。別の望ましくない解決策は、サービス プロセスで実行されているすべてのスレッドを見つけて、すべてのスレッドを終了/中止することです。これは単純ではなく、望ましい解決策でもありません。OnStop() で Environment.Exit を使用することを望んでいましたが、Windows でプロセスが予期せず終了した (エラー 1067) という悪い警告メッセージが表示されることがわかりましたが、これはまったく解決できませんでした。

今、レガシーコードに触れずに、この瞬間に短時間で何をすべきか混乱しています。どんな助けもかなりのものです。

4

1 に答える 1

1

でスレッドを開始できる場合はthread.IsBackground = true、すべてのフォアグラウンド スレッドが処理を終了したときに自動的にスレッドを中断することができます (たとえば、Stopメソッド) 。

于 2012-11-20T18:51:38.867 に答える