繁体   English   中英

Windows服务状态为“正在启动”

[英]Windows service status “Starting”

我已经编写了Windows服务,该服务会自动启动,并且状态变为“已启动”。 有时,服务状态会变为“正在启动”状态,并且即使在重新启动系统后也无法恢复到“已启动”状态。 这可能是由于代码中某些未处理的异常而发生的。

public partial class EngineHostService : ServiceBase
{
    internal static ServiceHost _serviceHost = null;

    public EngineHostService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        try
        {
            if (_serviceHost != null)
                _serviceHost.Close();

            _serviceHost = new ServiceHost(typeof(EngineService.Engine));
            _serviceHost.Open();
        }
        catch (Exception ex)
        {
            ErrorHandler.LogEvent(ex.Message);
        }
    }

    protected override void OnStop()
    {
        if (_serviceHost != null)
        {
            _serviceHost.Close();
            _serviceHost = null;
        }
    }

}

在上面的代码中,当Engine类的构造函数执行时,它将引发一些异常。 我想停止该服务:1-如果引发某些异常。 2-如果我在构造函数中调用的任何函数返回false。 有什么办法可以停止我想要的服务。 如果可以的话,我确定服务状态为“开始”或“停止”。 提出一些建议。

这听起来像任何InitializeComponent做太多的工作,或者说EngineService.Engine是做多的,在它的启动。 坦白说,您应该在启动时直接做很少的工作:验证配置,然后仅启动一个或多个工作线程进行实际工作。

单独关注。 您应该尽快从OnStart返回,所以我建议您在OnStart方法中启动异步TPL任务,然后再无其他操作。

在异步任务中,您可以做任何您想做的事情。

这样,您的服务将能够完成OnStart并将其正确地从“启动”转换为“已启动”。

服务控制管理器期望OnStart在30秒内完成。 如果启动需要更多时间,请通过RequestAdditionalTime(60 * 1000)通知SCM。 如果OnStart花费的时间太长,SCM将警告“无法启动服务”。 OnStart完成后,您的服务必须准备就绪,可以接受服务请求。

警告:请勿使用构造函数执行应在OnStart中进行的处理。 使用OnStart处理服务的所有初始化。 当应用程序的可执行文件运行时(而不是服务运行时)调用构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM