C# 未引发ApplicationExit事件
我试图在程序被迫退出时保存一些数据 例如,如果PC关闭或被任务管理器关闭 它不是控制台或Winforms应用程序。这只是一个没有用户界面的后台进程C# 未引发ApplicationExit事件,c#,windows,msdn,C#,Windows,Msdn,我试图在程序被迫退出时保存一些数据 例如,如果PC关闭或被任务管理器关闭 它不是控制台或Winforms应用程序。这只是一个没有用户界面的后台进程 namespace Test { class Test { static void Main() { Application.ApplicationExit += new EventHandler(OnProcessExit); //some stuff
namespace Test
{
class Test
{
static void Main()
{
Application.ApplicationExit += new EventHandler(OnProcessExit);
//some stuff to do here
}
static void OnProcessExit(object sender, EventArgs e)
{
//saving all the important data
Console.WriteLine("Im out of here!");
Environment.Exit(0);
}
}
}
这就是我试过的。我没有收到任何错误,但没有调用我的处理程序。这里至少有两个问题 只有在调用
Application.Run()
并且Run()
方法即将返回时(例如,调用Application.Exit()
或Application.ExitThread()
,或关闭最后一个/主窗口等),才会引发Application.ApplicationExit
事件。在从未调用过Application.Run()
的非GUI程序中,Application
对象没有机会引发事件
强制终止进程可能会阻止执行更多的代码,包括事件处理程序。对于非GUI进程,更适合处理的事件是AppDomain.ProcessExit
。但是,如果您强制终止您的流程,即使是此事件也可能不会引发
因此,请尝试AppDomain.ProcessExit
事件。但请注意,根据进程的终止方式,即使是这样也可能不会引发
如果您需要比这更具体的帮助,请提供一个好的示例,显示您尝试过的内容,重现您遇到的任何问题,并以精确和具体的细节解释代码现在的确切行为以及您想要的内容
附加阅读:
这些相关帖子似乎都没有充分涵盖“强制终止”场景,因此在技术上与您的问题并不完全相同,但它们确实提供了各种关于检测您自己流程退出的技术的良好讨论。这里至少有两个问题 只有在调用
Application.Run()
并且Run()
方法即将返回时(例如,调用Application.Exit()
或Application.ExitThread()
,或关闭最后一个/主窗口等),才会引发Application.ApplicationExit
事件。在从未调用过Application.Run()
的非GUI程序中,Application
对象没有机会引发事件
强制终止进程可能会阻止执行更多的代码,包括事件处理程序。对于非GUI进程,更适合处理的事件是AppDomain.ProcessExit
。但是,如果您强制终止您的流程,即使是此事件也可能不会引发
因此,请尝试AppDomain.ProcessExit
事件。但请注意,根据进程的终止方式,即使是这样也可能不会引发
如果您需要比这更具体的帮助,请提供一个好的示例,显示您尝试过的内容,重现您遇到的任何问题,并以精确和具体的细节解释代码现在的确切行为以及您想要的内容
附加阅读:
这些相关帖子似乎都没有充分涵盖“强制终止”场景,因此在技术上与你的问题并不完全相同,但是,它们确实提供了各种关于检测您自己的流程退出的技术的良好讨论。如果您或访问这里的任何人正在使用表单,那么这可能会有所帮助 这就是我的工作原理:
public Form1{
//some code...
AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);
}
public void OnProcessExit(object sender,EventArgs e){
MyDataLoggerMethod("Monitoring ended.");
}
如果您或访问过这里的任何人正在处理表单,那么这可能会有所帮助 这就是我的工作原理:
public Form1{
//some code...
AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);
}
public void OnProcessExit(object sender,EventArgs e){
MyDataLoggerMethod("Monitoring ended.");
}