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

时间:2013-04-11 13:50:50

标签: c# service windows-services

我需要我的服务来检查某些文件在启动期间的存在和结构,如果不满足某些条件则退出/失败/停止。 我读了这个帖子:What is the proper way for a Windows service to fail? 但它没有帮助。

我将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看不到服务停止/失败?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

如果您真的希望它在OnStart期间中止,请设置您的ExitCode,然后设置例外(InvalidArgumentExceptionInvalidOperationException

这篇文章也有一些很好的建议。 .NET: Which Exception to Throw When a Required Configuration Setting is Missing?

答案 2 :(得分:0)

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