17

我正在编写一系列 Windows 服务。OnStart()如果在启动期间(在方法中)抛出错误,我希望它们失败。我原以为仅仅抛出一个错误OnStart()就可以做到这一点,但我发现它改为“启动”并向我显示一条消息,说明“服务已启动,但处于非活动状态。这是正确的吗?” (释义)。如何处理错误,使其实际上无法启动服务?

4

3 回答 3

16

如果您想要的主要内容是让服务窗口报告有错误,从我尝试过的(Windows 7 上的 .NET3.5)开始,唯一的方法是设置ExitCode. 我建议将其设置为 13816,因为这会导致消息“发生未知错误”。请参阅Windows 错误代码

下面的示例完成了三件事。

  1. 设置 ExitCode 会为最终用户提供有用的消息。它不会影响 Windows 应用程序日志,但会在系统日志中包含一条消息。
  2. 调用 Stop 会导致应用程序日志中出现“服务已成功停止”消息。

  3. 抛出异常会在应用程序日志中生成一个有用的日志条目。

protected override void OnStart(string[] args) {
    try {
        // Start your service
    }catch (Exception ex) {
        // Log exception
        this.ExitCode = 13816;
        this.Stop();
        throw;
    }  
}
于 2012-08-08T18:22:04.937 回答
8

如果您正在运行 .NET 2.0 或更高版本,则可以使用ServiceBase.Stop从 OnStart 停止服务。否则从新线程调用 Stop。

参考 [devnewsgroups] ( http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx )

(新闻组走了)

于 2008-10-01T17:54:39.997 回答
7

将所有启动逻辑移至单独的方法,并从该单独的方法中引发异常(或调用 OnStop)。

OnStart 在启动时有一些奇怪的地方。我发现如果 OnStart() 中的行数不超过一行,那么我不会收到“服务已启动然后停止。某些服务如果无工作可自动停止”消息,并且抛出的异常将终止处理并记录到应用程序事件日志。

同样使用单独启动方法,您可以使用这样的技术来调试它而无需附加。http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx

于 2008-10-01T17:49:56.700 回答