未引发 ApplicationExit 事件

ApplicationExit event not being raised

我正在尝试在程序强制退出时保存一些数据。

例如,如果 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() 方法即将 return 时才会引发 Application.ApplicationExit 事件(例如,您调用了 Application.Exit()Application.ExitThread(),或关闭last/mainwindow等)。在您从未调用过 Application.Run() 的非 GUI 程序中,Application 对象没有机会引发事件。

强制终止一个进程可以阻止任何更多代码的执行,包括事件处理程序。对于非 GUI 进程,更适合处理的事件是 AppDomain.ProcessExit。但是,如果您强行终止您的进程,即使这个事件也可能不会引发。

所以,尝试 AppDomain.ProcessExit 事件。但请注意,根据进程的终止方式,即使这样也可能不会引发。

如果您需要比这更具体的帮助,请提供一个很好的 Minimal, Complete, and Verifiable code example 来展示您尝试过的内容,重现您遇到的任何问题,并提供精确且 具体的解释 详细说明了代码现在的确切行为以及您想要的行为。


补充阅读:
How to run code before program exit?
C# Windows Program Exit Request (Detect Application.Exit) No Forms
How to detect when application terminates?

None 这些相关帖子似乎确实充分涵盖了 "forceful termination" 场景,因此在技术上并不是您问题的精确副本,但它们确实提供了关于技术的各种很好的讨论检测到您自己的进程正在退出。

如果您或访问这里的任何人正在处理表单,那么这可能会有所帮助。

这对我有用:

public Form1{
  //some code...
  AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);

}
public void OnProcessExit(object sender,EventArgs e){
   MyDataLoggerMethod("Monitoring ended.");
}