私のWindowsサービスは、かなりのキャッシュを備えたデータサーバーです。OnStopのサービス中に、データが失われないようにキャッシュを保存します。キャッシュの保存には数分かかる場合があるため、Windowsサービスマネージャーがタイムアウトしないように、SetServiceStatusWin32コールバックを使用します。
this.serviceStatus.currentState = (int)State.SERVICE_STOP_PENDING;
this.serviceStatus.checkPoint = 1;
this.serviceStatus.waitHint = 60000;
SetServiceStatus(Process.GetCurrentProcess().Handle, ref this.serviceStatus);
それはうまくいきます。
また、CanShutdownをtrueに設定し、OnShutdownを追加して、サービスがシステムのシャットダウンに耐えられるようにしました。ここでは、OnStopと同じことを効果的に行います。
protected override void OnShutdown()
{
this.OnStop();
base.OnShutdown();
}
それはあまりうまくいきません。システムがシャットダウンし、キャッシュが保存されているときに、「デバイスの準備ができていません」というメッセージが表示されます。これは、Windowsが停止/シャットダウンを完了する前にサービスを中止することを示唆しています。SetServiceStatusでそれを防ぐことは明らかに機能しません。
保存を完了するための時間を増やす(再起動を遅らせる)にはどうすればよいですか?
どんな提案も歓迎します。