解决WPF主窗口关闭后进程不退出的问题

最近遇到一个奇怪的问题,就是在Visual Studio中调试时,MainWindow关闭后,VisualStudio还处在调试状态。

这就说明还有线程在运行,我找了一下,发现并没有开启后台线程。

去网上找了一下,大家给出的建议是在退出事件中,在MainWindow的Closing事件中调用Envionment.Exit(0)。如下:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
              Environment.Exit(0);
        }

这样当然是可以的,如果确认后台线程中没有需要保存的数据,可以用这种方式,强制退出是可行的。

但是如果在后台线程中处理了数据,这样也是不安全的,因为这种方式可能会造成数据的丢失。

 

我继续找了一下,发现我这里主窗口关闭后无法退出 的原因是我在Page中实例化了一个窗口对象,但是在退出时,没有调用这个窗口对象的关闭函数。如果不是在Page中,这种操作是不会有影响的

可以看一下问题是如何出现的:

我们新建一个页面(Page1)和一个窗口(Window1),在Page1.xaml.cs中创建一个Window1的对象

1  public partial class Page1 : Page
2     {
3         public Window1 win = new Window1();4 
5         public Page1()
6         {
7             InitializeComponent();
8         }
9     }

 

MainWindow.xaml

<Window x:Class="WpfApp3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp3"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Frame Name="frame"></Frame>
    </Grid>
</Window>

 

在MainWindow中放置了一个Frame,在这个Frame中显示Page1

MainWindow.xaml.cs

 1   public partial class MainWindow : Window
 2     {
 3         Page1 page1 = new Page1();
 4 
 5         public MainWindow()
 6         {
 7             InitializeComponent();
 8 
 9             frame.Content = page1;
10         }
11     }

 

在VisualStudio中调试运行,关闭MainWindow后,发现Visual Studio还在运行。

在MainWindow的Closing事件中,加上Window1的关闭代码,如下:

1  private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
2         {
3             page1.win.Close();
4         }

此时我们关闭MainWindow时,就能正常退出了。当时遇到这个问题,也是困惑了一会,没找到是啥原因,因为一直没往这方面想。

 

Window是独立存在的,Page只能显示在Frame或NavigationWindow中,具体是什么原因造成这个现象,还需要进一步深究。

posted @ 2022-09-14 12:06  zhaotianff  阅读(3415)  评论(0)    收藏  举报