[英]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.