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