2013-04-11 74 views
3

我需要我的服务来检查某些文件在其启动过程中是否存在以及某些文件的结构,如果没有满足某些条件,请退出/失败/停止。 我看了这个帖子:What is the proper way for a Windows service to fail? 但它没有帮助。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没有将服务视为停止/失败?

+0

我发现扔的不是调用停止()防止被调用的调用OnStop事件例外,我怀疑赢记录你所看到的“已成功停止”的信息。到目前为止我唯一能找到的似乎是可能的退出代码列表是http://www.hiteksoftware.com/mize/Knowledge/articles/049.htm。如果我使用不在列表中的退出代码,则会收到类似[“Error 10501:0x2905”](http://i.imgur.com/UohWLVr.png)(x2905 =十进制值10501)的消息。关于退出代码是否没有MSDN文档,或者有关如何向用户发出如何调试问题的指导? – gregmac 2013-07-19 19:36:07

回答

1

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

0

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

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

如果你真的希望它在OnStart只是中止,设置你的ExitCode,然后抛出一个异常(InvalidArgumentExceptionInvalidOperationException)例如

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

0

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

相关问题