我正在编写一系列 Windows 服务。OnStart()
如果在启动期间(在方法中)抛出错误,我希望它们失败。我原以为仅仅抛出一个错误OnStart()
就可以做到这一点,但我发现它改为“启动”并向我显示一条消息,说明“服务已启动,但处于非活动状态。这是正确的吗?” (释义)。如何处理错误,使其实际上无法启动服务?
3 回答
如果您想要的主要内容是让服务窗口报告有错误,从我尝试过的(Windows 7 上的 .NET3.5)开始,唯一的方法是设置ExitCode
. 我建议将其设置为 13816,因为这会导致消息“发生未知错误”。请参阅Windows 错误代码。
下面的示例完成了三件事。
- 设置 ExitCode 会为最终用户提供有用的消息。它不会影响 Windows 应用程序日志,但会在系统日志中包含一条消息。
调用 Stop 会导致应用程序日志中出现“服务已成功停止”消息。
抛出异常会在应用程序日志中生成一个有用的日志条目。
protected override void OnStart(string[] args) {
try {
// Start your service
}catch (Exception ex) {
// Log exception
this.ExitCode = 13816;
this.Stop();
throw;
}
}
如果您正在运行 .NET 2.0 或更高版本,则可以使用ServiceBase.Stop从 OnStart 停止服务。否则从新线程调用 Stop。
参考 [devnewsgroups] ( http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx )
(新闻组走了)
将所有启动逻辑移至单独的方法,并从该单独的方法中引发异常(或调用 OnStop)。
OnStart 在启动时有一些奇怪的地方。我发现如果 OnStart() 中的行数不超过一行,那么我不会收到“服务已启动然后停止。某些服务如果无工作可自动停止”消息,并且抛出的异常将终止处理并记录到应用程序事件日志。
同样使用单独启动方法,您可以使用这样的技术来调试它而无需附加。http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx