【问题标题】:Termination scenario in C#C# 中的终止场景
【发布时间】:2009-12-16 00:41:53
【问题描述】:

我想在使用 Windows 任务管理器终止我的 WinFormsApplication 时执行一些代码(清除资源)。我该怎么做?我正在使用 TaskManager 的进程选项卡终止我的应用程序。

【问题讨论】:

    标签: c# .net terminate


    【解决方案1】:

    如果您的应用程序被强制关闭,我不确定是否有可靠的方法来确保您清理资源。我假设您的资源是您而非 Windows 管理的非标准资源。

    有两种可能。第一个是安装一个 Windows 服务应用程序,它监视您的应用程序并确保在您的应用程序被终止时清理其资源。这需要一些进程间通信和大量编码。

    第二个是确保应用程序启动时资源是干净的。在运行时检查您的资源是否存在,并在继续执行之前清理它们。

    【讨论】:

    • 您可能还需要考虑为什么用户首先需要使用进程选项卡来结束您的进程。
    【解决方案2】:

    从您的主窗体连接ApplicationExit 事件并在那里进行清理。

    编辑: 如果您通过任务管理器关闭应用程序,则无法捕获任何事件。这些事件需要正常的终止过程。

    【讨论】:

    • 如果您使用 taskmanager 终止它,则不会调用此事件处理程序。
    【解决方案3】:

    在您的主应用窗口中处理此事件:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
        if(e.CloseReason == CloseReason.TaskManagerClosing) {
            // clean up code
        }
    }
    

    【讨论】:

    • @Christian Hayter,在我的情况下,你的方式没用,因为我正在使用 TaskManager 的 Process Tab 终止我的应用程序。查看我的编辑
    • 你真的有点卡住了。 FormClosing 事件在从应用程序选项卡关闭时触发,因为应用程序选项卡将 Windows 退出消息发送到应用程序的消息循环。这使应用程序有机会执行代码。如果从“进程”选项卡中关闭它,则终止进程而不执行任何代码。因此,它可能无法捕获。
    【解决方案4】:

    我不确定,也没有尝试过。但我的猜测是,它应该可以通过捕获一些 Win32 事件来实现。试试 WM_CLOSE、CTRL_CLOSE_EVENT

    【讨论】:

      【解决方案5】:

      CriticalFinalizerObject 可能会根据它的描述帮助你:

      ...公共语言运行时 (CLR) 保证所有关键 最终代码将给出 执行的机会,前提是 终结器遵循 CER 的规则, 即使在 CLR 强制卸载应用程序域 或中止线程

      【讨论】:

        猜你喜欢
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2013-04-27
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多