如果 windows 服务 运行 在崩溃后必须重新启动,我该如何制作一些代码?
How can I make a windows service run some code if it had to restart after a crash?
假设 windows 服务崩溃,并由于一些恢复选项而自动重启。我想 运行 程序 (C#) 中的一些代码,只要发生这种情况,它们就会执行一些网络操作(发送关闭警报)。
是否有我可以申请的事件或我可以在该事件发生后获得 运行 的代码?
谢谢!
您可以订阅以下事件,无论在哪个线程中发生异常,该事件都会触发..
AppDomain.CurrentDomain.UnhandledException
实施示例
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// log the exception ...
}
在这种情况下,我会做的不是在程序失败时写出一些东西,而是让程序将某种记录写到持久存储中,如果它检测到正在干净关闭,它就会删除这些记录完成。
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"));
}
//...
}
这很容易将文件替换为注册表项或数据库中的记录。
假设 windows 服务崩溃,并由于一些恢复选项而自动重启。我想 运行 程序 (C#) 中的一些代码,只要发生这种情况,它们就会执行一些网络操作(发送关闭警报)。
是否有我可以申请的事件或我可以在该事件发生后获得 运行 的代码?
谢谢!
您可以订阅以下事件,无论在哪个线程中发生异常,该事件都会触发..
AppDomain.CurrentDomain.UnhandledException
实施示例
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// log the exception ...
}
在这种情况下,我会做的不是在程序失败时写出一些东西,而是让程序将某种记录写到持久存储中,如果它检测到正在干净关闭,它就会删除这些记录完成。
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"));
}
//...
}
这很容易将文件替换为注册表项或数据库中的记录。