1

假设一个 Windows 服务崩溃,并且由于某些恢复选项而自动重新启动。我想在程序(C#)中运行一些代码,每当发生这种情况时,它会执行一些网络操作(发送一个它关闭的警报)。

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

谢谢!

4

2 回答 2

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"));
    }

    //...
}

这可以很容易地用注册表项或数据库中的记录换出文件。

于 2016-02-22T21:05:11.733 回答
2

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

AppDomain.CurrentDomain.UnhandledException

示例实现

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

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
 // log the exception ...
}
于 2016-02-22T20:58:22.823 回答