Windowsサービスの起動タイムアウト
-
03-07-2019 - |
質問
サービスごとにサービス起動タイムアウトに異なる値を設定する方法はありますか? ServicesPipeTimeoutレジストリキーを使用して変更できますが、マシンごとです( http://support.microsoft.com/ kb / 824344 )。
現時点で考えた唯一のことは、時間のかかるすべての起動アクションを別のスレッドで実行することでした。
解決
できるだけ早くサービスの開始を終了することをお勧めします。したがって、 start 状態の間は、正常に開始されたことを確認するために絶対に必要なことだけを行ってください。残りは後で行います。 start がまだ長いプロセスである場合は、 SetServiceStatus 定期的に Service Control Manager に通知して、まだ終了していないことを通知します。したがって、サービスはタイムアウトしません。
他のヒント
できるだけ早くサービスを開始するための仕上げについてはRomuloに同意します。ただし、時間が必要で、.NET Framework 2.0以降を使用している場合は、ServiceBase.RequestAdditionalTime()メソッドを検討してください。
protected override void OnStart()
{
this.RequestAdditionalTime(10000);
// do your stuff
}
単に別のスレッドで時間のかかるものを行う
protected override void OnStart(string[] args)
{
var task = new Task(() =>
{
// Do stuff
});
base.OnStart(args);
task.Start();
}
また、良いスタートを切るには数秒/分かかるサービスに対処しなければなりませんでした。サービスが開始されると、SQL Serverへの接続が試行されます。ただし、サーバー全体を再起動すると、サービスはSQL Serverの前に開始されました。 (サービスの依存関係については知っていますが、特定の理由で私の状況に当てはまりません。...)。 SQL Serverに接続するために10回ループを試行しましたが、タイムアウトのため、2回目の試行の前にWindowsがサービスを強制終了していました。
私のソリューション:" onStart()"にタイマーを追加しました私のサービスの。次に、「onTick()」;サービスのメソッドは、SQL Serverへの接続を10回試行しました(30の待機中)。起動時のタイムアウトはもうありません。
つまり、基本的に
- 私のサービスは5秒後に開始します。
- サービスが開始されてから10秒後にタイマーが起動します 開始しました。
- タイマーは10回[毎回30秒待機]を試みます SQL Serverに接続します。
- 成功した場合、タイマーは自動的に無効になり、そうでない場合(10試行後)、サービスを停止します。
問題を解決するよりエレガントな方法に注意してください。しかし、おそらく私の解決策の一部は、私よりも同じ状況にいる人を助けるかもしれません