如果崩溃后必须重新启动,如何让Windows服务运行一些代码?

时间:2016-02-22 20:51:44

标签: c# windows-services disaster-recovery

让我们说Windows服务崩溃,并由于某些恢复选项而自动重启。我想在程序(C#)中运行一些代码,这些代码会发生一些网络动作(发送它关闭的警报)。

是否有我可以应用的事件或我可以在发生后运行的代码?

谢谢!

2 个答案:

答案 0 :(得分:3)

在这种情况下,我要做的不是在程序失败时写出一些内容,而是让程序将某种记录写入持久存储,然后如果检测到正在执行干净关闭则删除。

public partial class MyAppService : ServiceBase
{
    protected override void OnStart(string[] args)
    {
        if(File.Exists(Path.Combine(Path.GetTempPath(), "MyAppIsRunning.doNotDelete"))
        {
            DoSomthingBecauseWeHadABadShutdown();
        }
        File.WriteAllText(Path.Combine(Path.GetTempPath(), "MyAppIsRunning.doNotDelete"), "");
        RunRestOfCode();
    }

    protected override void OnStop()
    {
        File.Delete(Path.Combine(Path.GetTempPath(), "MyAppIsRunning.doNotDelete"));
    }

    //...
}

这可能很容易将文件与注册表项或数据库中的记录交换出来。

答案 1 :(得分:2)

您可以订阅以下事件,无论发生异常的哪个线程都会触发该事件。

  

AppDomain.CurrentDomain.UnhandledException

示例实施

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
 // log the exception ...
}