Windows服务在启动期间失败的正确方法是什么

我需要我的服务来检查某些文件在启动期间的存在和结构,如果不满足某些条件则退出/失败/停止。 我读了这个post: Windows服务失败的正确方法是什么? 但它没有帮助。

我将ServiceBase.ExitCode属性设置为非零,然后调用ServiceBase.Stop。 但我得到5个事件日志条目。 见下文:

Starting service. (I log this event via code) Config.xml file not found. (I log this ERROR event via code) Service stopped successfully. (SCM logs this message) Service started successfully. (SCM logs this message) Service cannot be started. The handle is invalid (SCM logs this message) 

正如你所看到的,除了最后两个条目外一切正常。 他们为什么在那里? 如何在启动期间正确关闭服务? 为什么SCM看不到服务停止/失败?

您没有提供足够的代码来真正了解,但我怀疑您正在尝试validation服务并在构造函数或OnStart中停止它。 我喜欢处理服​​务的方式是在OnStart中启动我的计时器。 在计时器的第一个时间间隔内,我可以validation所有代码,如果无效则关闭服务。 如果它有效,将计时器的间隔重置为我希望它运行的频率,然后设置一个bool,告诉它不再检查文件的有效性。

您为ExitCode使用的返回代码是什么? 如果它与相应的窗口ExitCode匹配,那么这将是SCM将记录的内容。 我假设你为ExitCode返回6。

另一件事是,如果你可以运行默认值,那么让Config.xml丢失,只记录EventLog中的问题。 “配置文件丢失”

如果你真的希望它在OnStart期间中止,请设置你的ExitCode然后抛出exception( InvalidArgumentExceptionInvalidOperationException )例如

这篇文章也有一些很好的建议。 .NET:当缺少必需的配置设置时抛出哪个exception?

您正在尝试启动第二个服务实例(为同一个.exe注册的另一个服务)