Windows服务启动超时

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

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

尽快完成启动服务是一种很好的做法。 所以,在启动状态下,只做你绝对需要承认它开始成功; 稍后再做。 如果启动仍然是一个漫长的过程,请定期使用SetServiceStatus通知服务控制pipe理器您尚未完成,所以它不会超时您的服务。

我同意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 } 

我也必须处理一个可能需要几秒/分钟的服务才能有一个好的开始。 服务启动时,它会尝试连接到SQL Server。 但是,当整个服务器重新启动时,我的服务正在启动SQL Server之前。 (我知道服务的依赖关系,但不适用于我的情况有特殊的原因….)。 我试图做一个循环尝试10次连接到SQL Server,但由于超时,Windows在第二次尝试之前正在杀死我的服务。

我的解决scheme :我在我的服务的“onStart()”中添加了一个Timer。 然后,该服务的“onTick()”方法尝试了10次连接到SQL Server(等待30)。 没有更多的超时在启动。

所以基本上,

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

请注意解决问题的更优雅的方式,但也许我的解决scheme的一部分可能会帮助任何人在相同的情况比我,

只需在另一个线程中完成时间密集的工作

  protected override void OnStart(string[] args) { var task = new Task(() => { // Do stuff }); base.OnStart(args); task.Start(); }