ApplicationExit事件未被引发

时间:2016-10-20 00:57:29

标签: c# windows msdn

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

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

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

2 个答案:

答案 0 :(得分:4)

这里至少有两个问题。

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

强制终止进程可以阻止任何更多代码执行,包括事件处理程序。对于非GUI进程,要处理的更合适的事件是Application。但是如果你强行终止你的过程,即使这个事件也可能不会被提出。

所以,试试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?

这些相关帖子似乎都没有充分涵盖“强制终止”方案,因此在技术上并不完全与您的问题重复,但它们确实提供了各种关于检测您自己的流程退出的技术的良好讨论。 / p>

答案 1 :(得分:0)

如果您或访问这里的任何人都在使用Form,那么这可能会有所帮助。

这对我有用:

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

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