【问题标题】:C# WPF Application keeps running after the exit when a new created Window is followed with an Exception当新创建的窗口出现异常时,C# WPF 应用程序在退出后继续运行
【发布时间】:2020-11-01 20:30:53
【问题描述】:

让我们看一个带有两个 Window 类的简单 WPF 应用程序。 MainWindow 有一个控件 - 按钮 - 它创建了 AnotherWindow 实例。如果在创建之后在主线程退出ButtonMethod作用域之前发生了异常,那么在MainWindow关闭并消失后应用程序仍然在运行。

解决方法是将新窗口的 Owner 属性设置为 MainWindow 对象实例。

如果在创建另一个窗口的实例后没有w.Show()w.Close() 调用,即使没有任何异常抛出,应用程序也将继续运行。

问题:

  • 在哪里描述了 WPF 窗口线程的这种行为?

  • 什么是创建其他窗口的最佳实践,但要牢记例外可能性:设置窗口的Owner,在某些finally 范围内调用window.Close() 或其他什么?

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                ButtonMethod();
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }

        private void ButtonMethod()
        {
            Window w = new AnotherWindow();
            // Uncomment the line below to fix freezing at the exit.
            // w.Owner = this;
            throw new Exception("Custom user exception!");
            w.Show();
        }
    }

【问题讨论】:

    标签: c# wpf window


    【解决方案1】:

    要在 wpf 上打开一个新窗口,请使用以下代码:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        SecondWindow w = new SecondWindow();
        w.Show();
    }
    

    如果你想关闭你正在使用的那个是:

    This.close();
    

    你不需要代码

    throw new Exception("Custom user exception!");

    因为您只是在制造一个无论如何都要捕获的异常,所以当您想要调试代码或查看它是否捕获了正确类型的异常时(通常)会抛出一个异常。我希望我能帮上忙。

    【讨论】:

    • 对不起,但你不理解我:) 我知道异常是如何工作的。我说明了一种情况,即在显示该窗口之前创建新窗口后引发意外异常。问题是:为什么在这种情况下应用程序无法完成所有线程并在关闭 MainWindow 后继续运行。
    • stackoverflow.com/a/14131739/12764752 这个答案可能会对您有所帮助,它展示了如何以安全的方式终止线程。代表您的问题:因为该部分是在 .net 端完成的,这可能是因为它没有被垃圾收集器收集,它这样做可能是因为在某些情况下您可能想要求用户保存他们的数据什么的,但这只是猜测。我希望这是一个更好的答案:D
    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 2012-04-22
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多