1

私の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でそれを防ぐことは明らかに機能しません。

保存を完了するための時間を増やす(再起動を遅らせる)にはどうすればよいですか?

どんな提案も歓迎します。

4

4 に答える 4

2

これを処理するための好ましい方法は、BCLチームのブログのこの記事にあります。この記事には、マネージドサービスがSCMとどのように相互作用するかについての背景が少し含まれています。これは、質問に示されているアプローチが推奨されなくなった理由を理解するために重要です。

簡単に言えば、ServiceBaseがサービス状態管理を処理するようになり、コードは必要に応じて追加の時間を要求するだけで済みます。.NETでSCMに適したサービスを作成するためのその他の優れたガイドラインについては、この記事をお読みください。

于 2011-02-01T23:46:21.650 に答える
0

ManualResetEventを使用するのがコツかもしれません。

于 2010-02-15T13:08:21.417 に答える
0

いくつかのテストの後、それは私のサービスではなくシステムの問題であるように見えます。

于 2010-02-17T11:38:19.260 に答える
0

setservicestatus別の簡単な方法は、メソッドを含める方法を何時間も検索した後です。

    protected override void OnStop()
    {
        stopTimer();
        m_run = false;
        while (m_queue.Count > 0)
            Thread.Sleep(500);
    }
于 2012-03-14T12:55:29.393 に答える