0

我编写了一个自动启动的 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。有什么方法可以按我的意愿停止服务。如果我这样做,我肯定服务状态为“已启动”或“已停止”。建议一些方法。

4

3 回答 3

0

听起来要么InitializeComponent做太多工作,要么EngineService.Engine它的启动中做了很多工作。坦率地说,你应该在启动时直接做很少的事情:验证配置,然后启动一个工作线程(或几个)来进行真正的工作。

于 2013-02-25T08:08:59.600 回答
0

分开关注。您应该尽快从 OnStart 返回,所以我建议在您的 OnStart 方法中启动一个异步 TPL 任务,然后什么都不做。

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

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

于 2013-02-25T08:18:55.827 回答
0

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

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

于 2013-02-28T07:11:54.847 回答