【问题标题】:Why does my C# WPF program keep executing lines after Application.Shutdown()?为什么我的 C# WPF 程序在 Application.Shutdown() 之后继续执行行?
【发布时间】:2011-12-15 22:47:52
【问题描述】:

这是一段代码,我在其中弹出了一个简单的对话框(“选择器”)。根据用户的输入,应用程序可能会终止。

    DPChooser chooser = new DPChooser(dataProvider);
    if (chooser.ShowDialog() == false)
        Application.Current.Shutdown(0);
    else
        ApplicationContext.Current.InitializeDataProviderAPI(chooser.DataProvider);
    }

    // more code continues here
    // THE PROBLEM:
    //     Even when Shutdown() above is called,
    //     the execution continues proceeding past here!

我已经在调试器中运行它,所以我知道 if 评估结果为假,并且我知道 Shutdown( ) 正在被调用。

那它为什么不关闭呢?

注意:我认为这不是线程问题。我还没有在其他线程上开始任何事情。即使涉及线程,我仍然不希望该线程中的代码继续通过 Shutdown()。

【问题讨论】:

    标签: c# wpf shutdown


    【解决方案1】:

    Shutdown 停止 Dispatcher 处理,并就 WPF 而言关闭应用程序,但实际上并没有杀死当前线程。

    在您的情况下,您需要阻止该调用之外的代码运行。一个简单的返回就足够了:

     if (chooser.ShowDialog() == false)
     {
         Application.Current.Shutdown(0);
         return;
     }
     else { //...
    

    【讨论】:

    • 嘿,这不是那么直观。不过,我应该考虑把一个回报放在那里,对我来说。谢谢。
    • 等等,Shutdown(int exitCode) 的文档说 exitCode 被返回给操作系统。如果这个方法实际上并没有杀死应用程序,那么应用程序如何使用它来返回这个exitCode?​​span>
    • @GrantB 这是受控关闭,不会停止正在执行的线程。如果您使用的是默认 WPF 管道,则此退出代码是从入口点返回的内容,但它会在其他所有内容执行之后发生(正如您在此处发现的那样)。
    • 很可能将其存储在应用程序上下文中.....是时候下载 dotPeek 并看看他们是如何实现它的 :)
    • @KeithNicholas 实际上是 Application.Run 的返回值 - msdn.microsoft.com/en-us/library/ms597010.aspx 默认管道从入口点例程返回此值。它永远不会“存储”在上下文中。
    【解决方案2】:

    它不会立即终止您的进程,而是受控关闭。

    如果你想(不推荐)立即杀死

    Process.GetCurrentProcess().Kill();
    

    【讨论】:

    • Environment.Exit() 也可以,但我知道它同样不可取。
    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多