【问题标题】:What is the timeout for starting a windows service?启动 Windows 服务的超时时间是多少?
【发布时间】:2010-11-12 17:11:52
【问题描述】:

我已经部署了我的 Windows 服务(使用独立的安装程序类和 SC.EXE),但是当我尝试启动它时出现错误:

---------------------------
Services
---------------------------
Could not start the MyName service on Local Computer.



Error 1053: The service did not respond to the start or control request in a timely fashion.

什么是超时?感觉大概3秒左右。如果我的服务需要更长的时间,我需要做什么?

【问题讨论】:

    标签: c# .net windows-services timeout


    【解决方案1】:

    在您的服务类中,在 OnStart/OnStop 方法中使用 ServiceBase.RequestAdditionalTime()

    // request an additional 4 seconds to complete the operation
    RequestAdditionalTime(4000);  
    

    【讨论】:

    • 这非常有用。谢谢。
    【解决方案2】:

    创建服务的常规方法是让启动代码创建一个新线程,并在该线程中运行您的服务。

    服务启动应该几乎是即时的 - 只不过是在其中生成一个包含“真实”工作的新线程。

    如果您花费的时间超过 3 秒,则表明您正在主线程中进行真正的工作,而不是为您的服务创建单独的工作。

    【讨论】:

    • 这假定设计不佳,可能不存在。复杂的初始化可能需要额外的时间,并且“未能响应”消息会提醒用户启动失败。如果故障发生在线程中并且服务因此停止,则唯一可见的证据(没有单独的监控 UI)将在事件日志中。
    • 启动有 3 秒的时间限制是有原因的。有一些方法可以扩展它(RequestAdditionalTime()),但建议服务应该立即启动,和/或将工作推送到单独的线程中,并以不同的方式发出警报。启动时间过长会导致其他服务无法及时启动,这是一个糟糕的设计,IMO。
    • 这个设计有点奇怪——为什么我要假装我的服务可以在 3 秒内启动,而实际上它在第 4 秒就失败了?
    • 我对请求 4 秒启动没有问题 - 但我会遇到请求 3 分钟启动的服务的问题。我会卸载该软件,因为它几乎会扼杀系统的启动时间......
    【解决方案3】:

    关于具体问题,具体超时时间各不相同,但小于 30 秒。您可以通过注册表项控制服务的默认启动超时,您可以查看如何执行此操作here

    但是,我同意许多其他人的观点,即我会考虑两种可能的选择。

    1. 尽快启动您的服务、生成线程等。
    2. 如果您不能使用选项一,您可以使用 RequestAdditionalTime()。请务必尽早拨打电话。

    【讨论】:

      【解决方案4】:

      另外,如果您在不同的物理环境中测试过服务,问题似乎不是正常启动时间,而是 PC 的性能。您可以增加特定 PC 的注册表项的超时时间。

      请看: http://support.microsoft.com/kb/839803

      问候

      【讨论】:

        猜你喜欢
        • 2018-07-01
        • 2016-02-11
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多