Windows服务状态“正在启动”

时间:2013-02-25 07:40:17

标签: c# wcf windows-services

我写了一个自动启动的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。 有没有办法按我的意愿停止服务。如果我这样做,我肯定会将服务状态设置为“已启动”或“已停止”。建议某种方式。

3 个答案:

答案 0 :(得分:0)

听起来好像InitializeComponent做了太多工作,或者EngineService.Engine它的启动时做了很多事情。坦率地说,你应该在启动时直接做很少的事情:验证配置,然后只为实际工作启动一个工作线程(或几个)。

答案 1 :(得分:0)

分开关注。 你应该尽可能快地从OnStart返回,所以我建议你在OnStart方法中启动异步TPL任务而不再做任何事情。

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

通过这样做,您的服务将能够完成OnStart并正确地从开始到开始。

答案 2 :(得分:0)

服务控制管理器希望OnStart在30秒内完成。 如果启动需要更多时间,请通过RequestAdditionalTime(60 * 1000)通知SCM; 如果OnStart耗时太长,SCM将提醒“无法启动服务”。 当OnStart完成您的服务时,必须准备好接受服务请求。

注意: 不要使用构造函数来执行应该在OnStart中的处理。使用OnStart处理服务的所有初始化。构造函数在应用程序的可执行文件运行时调用,而不是在服务运行时调用。