53

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

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

4

4 に答える 4

81

できるだけ早くサービスを開始することについて、ロムロに同意します。ただし、時間が必要で、.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
}
于 2009-05-26T08:28:04.783 に答える
38

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

于 2008-10-19T14:44:26.463 に答える
4

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

   protected override void OnStart(string[] args)
    {
        var task = new Task(() =>
        {
            // Do stuff
        });
        base.OnStart(args);
        task.Start();
    }
于 2015-05-27T07:00:36.793 に答える
1

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

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

だから基本的に、

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

問題を解決するためのよりエレガントな方法に注意してください。

于 2014-10-02T12:23:19.937 に答える