C# 服务启动时处理异常

C# 服务启动时处理异常,c#,.net,windows-services,error-handling,C#,.net,Windows Services,Error Handling,我正在编写一系列Windows服务。如果在启动过程中抛出错误,我希望它们失败(在OnStart()方法中)。我曾以为只要在OnStart()中抛出一个错误就可以做到这一点,但我发现它会“启动”,并向我显示一条消息,说明“服务已启动,但处于非活动状态。这是否正确?”(意译)。如何处理该错误,使其实际上无法启动服务?将所有启动逻辑移动到一个单独的方法,并从该单独的方法抛出异常(或在顶部调用) OnStart在启动时有一些奇怪之处。我发现如果OnStart()中只有一行,那么我不会收到“服务启动然后停

我正在编写一系列Windows服务。如果在启动过程中抛出错误,我希望它们失败(在
OnStart()
方法中)。我曾以为只要在
OnStart()
中抛出一个错误就可以做到这一点,但我发现它会“启动”,并向我显示一条消息,说明“服务已启动,但处于非活动状态。这是否正确?”(意译)。如何处理该错误,使其实际上无法启动服务?

将所有启动逻辑移动到一个单独的方法,并从该单独的方法抛出异常(或在顶部调用)

OnStart在启动时有一些奇怪之处。我发现如果OnStart()中只有一行,那么我不会收到“服务启动然后停止。如果没有工作要做,某些服务会自动停止”消息,抛出的异常将终止进程并记录到应用程序事件日志中


另外,使用分离启动方法,您可以使用类似这样的技术来调试它,而无需附加

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

参考[devnewsgroups]()


(新闻组消失)

如果您希望服务窗口根据我所尝试的(.NET3.5,在Windows 7上)报告出现错误,那么唯一的方法是设置
ExitCode
。我建议将其设置为13816,因为这会导致消息“发生未知错误”。请参阅

下面的示例完成了三件事

  • 设置ExitCode会为最终用户生成有用的消息。它不会影响Windows应用程序日志,但会在系统日志中包含一条消息
  • 调用Stop会在应用程序日志中显示“服务已成功停止”消息

  • 引发异常会在应用程序日志中生成有用的日志条目


  • 参考域将Internet存档转移到rescue:13816标记为IPSEC错误,因此它不完全适用,但服务控制管理器将任何非零int视为错误。我相信代码的意义取决于服务本身。这是一个非常好的观点。或许,代码1064会更好。(错误\u服务中的异常\u-在处理控制请求时服务中发生异常。)我的主要想法是向用户显示一条消息,该消息有些帮助,特别是不会误导用户。关键部分是设置ExitCode和抛出。不需要
    Stop()-ServiceBase中的异常处理程序执行此操作。
    
    protected override void OnStart(string[] args) {
        try {
            // Start your service
        }catch (Exception ex) {
            // Log exception
            this.ExitCode = 13816;
            this.Stop();
            throw;
        }  
    }