c# - 未引发 ApplicationExit 事件

标签 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);
        }
    }
}

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

最佳答案

这里至少有两个问题。

Application.ApplicationExit 事件仅在调用 Application.Run() 并且 Run() 方法即将执行时引发返回(例如,您调用了 Application.Exit()Application.ExitThread(),或关闭了上一个/主窗口等)。在您从未调用过 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?

这些相关帖子似乎都没有真正充分涵盖“强制终止”场景,因此在技术上不是您问题的精确副本,但它们确实提供了关于检测您自己的进程退出的技术的各种很好的讨论。

关于c# - 未引发 ApplicationExit 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40143822/

相关文章:

c# - 拥有较大的 dbContext 是否会影响性能?

c# - 使用数据读取器处理 excel 文件 : ExecuteReader() buffers entire file

python - 如何在 Windows 上的 IPython 中启用输出文本突出显示?

msdn - MSDN 订阅的成本是否会阻碍 .NET 的采用

c# - 如何使用 BLE 开发 Windows C# App

c++ - 从 MSDN 实现 __cpuid 示例给出了非常大的数字

c# - 转换后不需要的按钮调整大小

字典 <> 中的 C# linq

java - 将 Runtime.exec 与 "Program Files"一起使用的正确语法

c - 在 Windows 中区分 cmd 行参数和拖动到图标参数的方法?