WindowsサービスOnStopコンピュータのシャットダウン
Q:
私はC#でWindowsサービスを書いています。私は、サービスが、システムがシャットダウンしている場合など、サービスのコントロールパネルで停止したときに同じ行動を取ることにしたいです。私はどちらの場合も同じ行動を取ることにしたいです。
私はオーバーライドする必要がありますServiceBase.OnShutdownを() 、または上書きされServiceBase.OnStopを()十分な両方のケースのために?
回答:
オーバーライドOnShutdownが 正しい方法です。OnStopは、 シャットダウン時に呼び出されません。
Microsoft Windowsがというオプションを追加しました高速起動ではない実際にシャットダウンコンピュータを行います。
で述べたように、高速起動の説明を設定し、再起動は影響を受けません。これはなぜあるの再起動がトリガーOnShutdown とシャットダウン しません。
オフに高速起動するとトリガーされますOnShutdown の両方のために再起動 し、シャットダウン。
だから、実際には、呼び出しがServiceBase.OnShutdown()メソッドのとき、Windowsオペレーティングシステムのシャットダウン、ServiceBase.OnStopは()メソッドが呼び出されることはありませんが、安全のためにいる間、私はお勧めとOnStop OnShutdownメソッドで実装しますWindowsサービスの実行ロジックを停止する方法ならば、別の方法は、Windowsサービスの実行ロジックを停止しないようにロジックを停止するWindowsサービスは、加えて当社は、OnStopとOnShutdownメソッドでロック変数やフラグ変数を追加します。
また、Windowsは、オペレーティングシステムのシャットダウンをすることを注意し、唯一のWindowsサービスのプロセスがまだ終了することを強制されます。この時間を超える12秒、のServiceBase.OnShutdown()メソッドの実行時間に、あなたはこの記事を参照することができプレシャットダウンイベントを使用し、タイムアウト時間は3分に延長しました。
また、テストの後、DasMulli.Win32.ServiceUtils Windowsサービスフレームワークで、.NETのコアは、Windowsオペレーティングシステムのシャットダウンの欠陥を持っており、そのIWin32Service.Stop()メソッドを呼び出すことはありませんので、大きなセキュリティ上のリスクがあり、慎重にしてくださいと。