C# 未引发ApplicationExit事件

C# 未引发ApplicationExit事件,c#,windows,msdn,C#,Windows,Msdn,我试图在程序被迫退出时保存一些数据 例如,如果PC关闭或被任务管理器关闭 它不是控制台或Winforms应用程序。这只是一个没有用户界面的后台进程 namespace Test { class Test { static void Main() { Application.ApplicationExit += new EventHandler(OnProcessExit); //some stuff

我试图在程序被迫退出时保存一些数据

例如,如果PC关闭或被任务管理器关闭

它不是控制台或Winforms应用程序。这只是一个没有用户界面的后台进程

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