7

すべての実行がすぐに停止し、呼び出し側がタイムアウトになると思います。サービスを停止すると正確には何が起こり、それをどの程度制御できますか?

4

1 に答える 1

6

サービスコントロールマネージャーがサービスを停止するように指示すると、.Net ServiceBaseはステータスをSERVICE_STOP_PENDINGに設定し、サービスのOnStopメソッドを呼び出します。その通知で何をするかはあなた次第です。理想的には、CancellationTokenを使用して、現在動作しているスレッドに、それをラップしてできるだけ早く終了する必要があることを通知するなどのメカニズムがあります。あなたの場合、それはあなたのServiceHostを閉じることを含むかもしれません。OnStopメソッドは、それが(たとえば、スレッドに参加することによって)完了したことを認識するまで待機してから戻る必要があります。さらに時間が必要であることをサービスコントロールマネージャーに通知する方法、または通知を受け取り、停止に積極的に取り組んでいることを通知する方法があります(SERVICE_STATUSdwcheckpoint)。

OnStopからすぐに戻った場合(または実装を気にしない場合)、サービスのスレッドはすべて強制的にすぐに終了すると思います。私はこれを試したことがないので、はっきりとはわかりません。私は常にOnStopを実装し、すべてがクリーンアップされた後にのみ戻ります。OnStopを実装しているが、サービスコントロールマネージャーに作業中であることを通知せずに戻るのに非常に長い時間がかかる場合は、しばらく待機します(サービス停止まで20秒...これはレジストリ設定です)。次に、スレッドを終了します。

正しいことは、サービスをすばやく開始、停止、一時停止、継続するように作成することです。上記の説明からわかるように、ケースで何が起こるかは、サービスの実装方法に完全に依存します。あなただけが「確実に知る」ための情報を持っています。

http://blogs.msdn.com/b/bclteam/archive/2009/02/19/in-depth-how-net-managed-services-interact-with-the-servicecontrolmanager-scm-kim-hamilton.aspx

于 2012-07-26T18:41:03.520 に答える