ApplicationExit事件未被引发

本文关键字:事件 ApplicationExit | 更新日期: 2023-09-27 18:13:48

我试图保存一些数据时,程序被强制退出。

例如,如果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);
        }
    }
}

这是我尝试过的。我没有得到任何错误,但我的处理程序没有调用

ApplicationExit事件未被引发

这里至少有两个问题。

Application.ApplicationExit事件仅在您调用Application.Run()并且Run()方法即将返回时才会引发(例如,您调用了Application.Exit()Application.ExitThread(),或关闭了最后一个/主窗口等)。在从未调用过Application.Run()的非gui程序中,Application对象没有机会引发事件。

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

那么,试试AppDomain.ProcessExit事件。但是要注意,根据进程终止的方式,甚至可能不会引发此问题。

如果你需要比这更具体的帮助,提供一个好的最小化,完整和可验证的代码示例,显示你已经尝试过的,重现你遇到的任何问题,并以精确和特定的详细解释代码现在的确切行为以及你想要的替代


额外的阅读:
如何在程序退出前运行代码?
c# Windows程序退出请求(Detect Application.Exit) No Forms
如何检测应用程序何时终止?

这些相关的帖子似乎都没有充分地涵盖"强制终止"的场景,所以从技术上讲,它们并不是你问题的精确副本,但它们确实提供了各种关于检测自己的进程退出的技术的良好讨论。

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

这是我的工作:

public Form1{
  //some code...
  AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);
}
public void OnProcessExit(object sender,EventArgs e){
   MyDataLoggerMethod("Monitoring ended.");
}