53

有没有办法为每个服务设置不同的服务启动超时值?我可以使用 ServicesPipeTimeout 注册表项更改它,但它是每台机器(http://support.microsoft.com/kb/824344)。

目前我唯一想到的就是在不同的线程中执行所有耗时的启动操作。

4

4 回答 4

81

我同意 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
}
于 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 之前启动。(我知道服务依赖性,但由于特定原因它不适用于我的情况......)。我尝试循环尝试 10 次以连接到 SQL Server,但由于超时,Windows 在第二次尝试之前杀死了我的服务。

我的解决方案:我在服务的“onStart()”中添加了一个计时器。然后,服务的“onTick()”方法尝试 10 次连接到 SQL Server(其中等待 30 次)。启动时不再超时。

所以基本上,

  • 我的服务在 5 秒后开始。
  • 服务启动 10 秒后启动计时器。
  • 计时器尝试 10 次 [每次等待 30 秒] 以连接到 SQL Server。
  • 如果成功,计时器将自行禁用,如果没有(尝试 10 次后),我将停止服务。

请注意解决问题的更优雅的方法,但也许我的解决方案的某些部分可能会帮助与我处于相同情况的任何人,

于 2014-10-02T12:23:19.937 回答