【问题标题】:App.Exit does not exit immediately?App.Exit 不会立即退出?
【发布时间】:2011-06-01 13:55:00
【问题描述】:

我假设Application.Exit 导致应用程序立即退出,但我可以看到,根据下面的示例,它将在 for 循环结束后退出。还有什么时候这个命令会强制应用退出?

for (int I = 0; I < 1000; I++)
{
    if (I == 1)
        Application.Exit();
}

【问题讨论】:

    标签: c# winforms loops exit


    【解决方案1】:

    如您所见here,此方法“通知所有消息泵它们必须终止”和“此方法不会强制应用程序退出。”

    【讨论】:

      【解决方案2】:

      Application.Exit() 将导致应用程序在返回到底层消息泵后退出。如果您在 UI 线程中运行代码,那么直到您从您所在的任何 UI 方法(例如按钮单击处理程序)返回时才会执行此操作。

      【讨论】:

        【解决方案3】:

        问题是“我现在如何退出?”如果是这样,请使用 Environment.FailFast - 这是最快的方法,作为额外奖励,您可以在事件日志中留下一个条目。正如MSDN 所说,

        这个方法终止一个进程 没有运行任何主动尝试/最终 块或终结器。

        FailFast 方法写入消息 到 Windows 应用程序的字符串 事件日志,创建您的转储 应用程序,然后终止 当前进程。消息字符串是 也包括在错误报告中 微软。

        使用 FailFast 方法而不是 终止您的退出方法 应用程序,如果你的状态 应用程序损坏无法修复, 并执行您的应用程序 try/finally 块和终结器将 损坏的程序资源。

        【讨论】:

        • 请注意,FailFast 本质上等同于从任务管理器中强制关闭进程,并且会导致显示经典的丑陋 Windows 错误消息。它只应在极端情况下使用(例如 UI 线程死锁)。
        • @Dan - 同意,这是一种很好的“举手投降”的技巧,当有人单击“退出”按钮时不会运行。它也非常适合测试您的 WER 或重启/恢复代码。
        【解决方案4】:

        来自MSDN

        通知所有消息泵它们必须终止,然后在处理完消息后关闭所有应用程序窗口。

        -

        此方法不一定强制应用程序退出。 Exit 方法通常在消息循环中调用,并强制 Run 返回。要仅退出当前线程的消息循环,请调用 ExitThread。

        【讨论】:

          【解决方案5】:

          查看MSDN

          Exit 方法停止所有线程上所有正在运行的消息循环并关闭应用程序的所有窗口。此方法不一定强制应用程序退出。 Exit 方法通常在消息循环中调用,并强制 Run 返回。要仅退出当前线程的消息循环,请调用 ExitThread。

          【讨论】: