サービスごとにサービス起動タイムアウトに異なる値を設定する方法はありますか? ServicesPipeTimeoutレジストリキーを使用して変更できますが、マシンごとです( http://support.Microsoft.com/kb/824344 )。
現時点で私が考えたのは、時間のかかるすべての起動アクションを別のスレッドで実行することだけでした。
サービスをできるだけ早く終了することをお勧めします。したがって、start状態の間は、正常に開始されたことを確認するために絶対に必要なことだけを実行してください。残りは後で行います。 startがまだ長いプロセスである場合、定期的に SetServiceStatus を使用してServiceに通知しますControl Managerがまだ終了していないため、サービスがタイムアウトしません。
できるだけ早くサービスを開始するための仕上げについては、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
}
別のスレッドで時間のかかる作業を行うだけです
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の待機で)。起動時のタイムアウトはもうありません。
だから基本的に、
問題を解決するためのよりエレガントな方法に注意してください。しかし、私の解決策の一部は、私よりも同じ状況の人を助けるかもしれません