Windows服务启动超时

54

是否有一种方法可以为每个服务设置不同的服务启动超时时间?我可以使用ServicesPipeTimeout注册表键更改它,但它是适用于整台机器的(http://support.microsoft.com/kb/824344)。

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

4个回答

82

1
谢谢,这对我帮助很大!我有一些旧代码需要运行... - Turrau
1
警告,可能有注意事项:“HostControl.RequestAdditionalTime文档没有提到的是,你只能请求最多60或120秒。否则,它将忽略你的请求。”(来自此处:https://dev59.com/lXjZa4cB1Zd3GeqPdWSR,尚未验证,但值得考虑) - Frederik Struck-Schøning

39

尽可能快地启动服务是良好的实践。因此,在开始状态下,只需执行您确实需要的操作来确认成功启动,并稍后处理其他操作。如果启动过程仍然很长,请使用SetServiceStatus定期通知服务控制管理器表示您尚未完成,这样它就不会超时您的服务。


12
请注意,如果还有其他服务依赖于您的服务,那么它可能会期望在发布SERVICE_RUNNING后您的服务完全可用。 这就是在发布SERVICE_RUNNING之前完成所有初始化工作并在需要时使用SetServiceStatus请求更多时间的好理由。 - Ian Goldby

4

在另一个线程中执行耗时任务

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

在这里你必须小心,因为如果// Do stuff抛出异常,它将被吞噬而不是停止/崩溃服务。实际上,你可能希望知道服务没有工作,而不是“运行”,但实际上什么也没做或者没有正常工作。 - deadlydog

1
我还需要处理一个服务,可能需要几秒钟/几分钟才能很好地启动。当服务启动时,它会尝试连接到SQL Server。然而,当整个服务器重新启动时,我的服务在SQL Server之前启动。(我知道服务依赖性,但由于特定原因不适用于我的情况....)我尝试循环尝试10次连接到SQL Server,但Windows在第二次尝试之前杀死了我的服务,因为超时时间到了。 我的解决方案: 我在我的服务的"onStart()"中添加了一个定时器。然后,服务的"onTick()"方法尝试10次连接到SQL Server(每次等待30秒)。启动时不再有超时问题。
所以基本上,
  • 我的服务在5秒内启动。
  • 服务启动10秒后启动一个计时器。
  • 计时器尝试10次[每次等待30秒]连接到SQL Server。
  • 如果成功,计时器将禁用自身;否则(经过10次尝试)停止服务。
请注意更优雅的解决问题的方法,但也许我的解决方案的某些部分可以帮助处于和我相同情况的任何人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接