web-dev-qa-db-ja.com

Windowsサービスの起動タイムアウト

サービスごとにサービス起動タイムアウトに異なる値を設定する方法はありますか? ServicesPipeTimeoutレジストリキーを使用して変更できますが、マシンごとです( http://support.Microsoft.com/kb/824344 )。

現時点で私が考えたのは、時間のかかるすべての起動アクションを別のスレッドで実行することだけでした。

51
Meidan Alon

サービスをできるだけ早く終了することをお勧めします。したがって、start状態の間は、正常に開始されたことを確認するために絶対に必要なことだけを実行してください。残りは後で行います。 startがまだ長いプロセスである場合、定期的に SetServiceStatus を使用してServiceに通知しますControl Managerがまだ終了していないため、サービスがタイムアウトしません。

36
Rômulo Ceccon

できるだけ早くサービスを開始するための仕上げについては、Romuloに同意します。ただし、時間が必要で、.NET Framework 2.0以降を使用している場合は、ServiceBase.RequestAdditionalTime()メソッドを検討できます。

http://msdn.Microsoft.com/en-us/library/system.serviceprocess.servicebase.requestadditionaltime.aspx

protected override void OnStart()
{
    this.RequestAdditionalTime(10000);
    // do your stuff
}
79
Hinek

別のスレッドで時間のかかる作業を行うだけです

   protected override void OnStart(string[] args)
    {
        var task = new Task(() =>
        {
            // Do stuff
        });
        base.OnStart(args);
        task.Start();
    }
4
LuckyLikey

また、良いスタートを切るには数秒/分かかるかもしれないサービスに対処しなければなりませんでした。サービスが開始されると、SQL Serverへの接続が試行されます。ただし、サーバー全体を再起動すると、サービスはSQL Serverの前に開始されました。 (サービスの依存関係については知っていますが、特定の理由で私の状況に当てはまりません。..)。 SQL Serverへの接続を10回試行してループを実行しようとしましたが、タイムアウトのために、2回目の試行の前にWindowsがサービスを強制終了していました。

私のソリューション:私のサービスの「onStart()」にタイマーを追加しました。次に、サービスの "onTick()"メソッドは、SQL Serverへの接続を10回試行しました(30の待機で)。起動時のタイムアウトはもうありません。

だから基本的に、

  • 私のサービスは5秒で始まります。
  • サービスが開始されてから10秒後にタイマーが起動します。
  • タイマーは、SQL Serverへの接続を10回試行します(毎回30秒待機します)。
  • 成功した場合、タイマーは自動的に無効になり、そうでない場合(10試行後)、サービスを停止します。

問題を解決するためのよりエレガントな方法に注意してください。しかし、私の解決策の一部は、私よりも同じ状況の人を助けるかもしれません

1
Simon