2013-02-25 129 views
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。 有什么方法可以根据需要停止服务。如果我愿意,我肯定会将服务状态视为“已启动”或“已停止”。建议某种方式。

回答

0

单独的问题。 你应该尽可能快地从OnStart返回,所以我建议在你的OnStart方法中启动一个异步TPL任务,并且不要做任何事情。

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

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

+0

”在异步任务中,你可以做任何你想做的事 通过这样做你的服务将能够完成OnStart并从正确的开始移动到开始。这是好的... 但是我想停止从异步线程的服务,如果某个函数返回false或者有任何异常(处理或未处理)抛出。 – himanshu 2013-02-25 08:34:12

0

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

0

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

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