Windows服务在启动过程中失败的正确方法是什么?

本文关键字:方法 是什么 失败 服务 启动 过程中 Windows | 更新日期: 2023-09-27 18:08:34

我需要我的服务在启动和退出/失败/停止时检查某些文件的存在和结构,如果某些条件不满足。我读了这个帖子: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看不到服务已停止/失败?

Windows服务在启动过程中失败的正确方法是什么?

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

您为ExitCode使用的返回代码是什么?如果它匹配相应的windows ExitCode,那么SCM将记录它。我假设你为你的ExitCode返回一个6。

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

如果你真的想在OnStart期间中止,设置你的ExitCode,然后抛出一个异常(InvalidArgumentException, InvalidOperationException),例如

这篇文章也有一些好的建议。net:当需要的配置设置丢失时抛出哪个异常?

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