致命一次崩溃后重新启动服务

时间:2015-10-01 21:59:42

标签: c# service exception-handling

我有几个服务在99.9%的时间内正确运行。但是,它们与网络和数据库一起工作,偶尔会出现我未预料到的错误,导致代码崩溃并导致服务崩溃。在这种情况下,重新启动服务通常可以解决问题。

我的服务创建一个运行主代码的新线程。我已经将错误处理添加到服务类中,该服务类捕获并记录此线程中的任何未处理的异常。我想知道的是,如果我可以从服务类调用OnStop然后再调用OnStart来重启我的服务吗?

我使用的代码与OnStart和OnStop位于同一个类中。我在下面发布了它:

private void ExceptionHandler(object sender, UnhandledExceptionEventArgs args)
    {
        log.Append("Fatal Exception:\n" + args.ExceptionObject);
        eventLog.WriteEntry(log.ToString());
        log = new StringBuilder();

        OnStop();

        if (numberOfCrashes++ < 10)
        {
            Thread.Sleep(60000);
            OnStart(null);

            log.Append("The service has been restarted " + numberOfCrashes + " times.");
            eventLog.WriteEntry(log.ToString());
            log = new StringBuilder();
        }
    }

1 个答案:

答案 0 :(得分:1)

  

我想知道的是,如果我可以从中调用OnStop然后再调用OnStart   服务类重启我的服务?

这取决于 您是如何实施OnStartOnStop逻辑的。

例如,如果您的OnStart能够确定工作thead是否已经启动,如果是,它会停止并再次启动它,那么是的,您可以直接模拟服务重启调用这些方法。

因此,OnStartOnStop上的实际代码是您问题的正确答案,您需要重构它以满足以编程方式重新启动服务而无需重新启动服务的要求在操作系统级别。