解决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中,具体是什么原因造成这个现象,还需要进一步深究。

浙公网安备 33010602011771号