1. 有主視窗A,只有一個Button
2. 和子視窗B,有100個TextBox控制元件
3. 在視窗A中,有一個回圈,不停創建和顯示(ShowDialog)視窗B
4. 視窗B顯示出來后,立即把自己Close
問題是:視窗B關閉后,記憶體并沒有回收,直到第975次回圈時發生 OutOfMemoryException 例外。
不明白為何發生這樣的問題,代碼中并沒有用到任何非托管物件。
請教如何解決此問題?
下面是代碼:
A視窗:(MainWindow)
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Margin="100" Content="0" Click="Button_Click"></Button>
</Grid>
</Window>
/// <summary>
/// MainWindow.xaml 的互動邏輯
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
var num = 0;
var count = 0;
while (true)
{
this.Dispatcher.Invoke((Action)(() =>
{
try
{
var v = new TestWindow { Owner = this };
v.ShowDialog();
((Button)sender).Content = num;
count = Application.Current.Windows.Count;
//GC.Collect(); // 無效
//GC.WaitForPendingFinalizers(); // 無效
Thread.Sleep(1);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}));
Console.WriteLine(string.Format("Num={0} Count={1}", num++, count));
}
});
}
}
B視窗:(TestWindow)
<Window x:Class="WpfApplication2.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" WindowStartupLocation="CenterScreen" Height="300" Width="300" ContentRendered="Window_ContentRendered">
<Grid>
<StackPanel>
<Button Content="關閉" Click="Button_Click"></Button>
<StackPanel>
<StackPanel>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
<TextBox Text="A"></TextBox>
</StackPanel>
</StackPanel>
</StackPanel>
</Grid>
</Window>
/// <summary>
/// TestWindow.xaml 的互動邏輯
/// </summary>
public partial class TestWindow : Window
{
public TestWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void Window_ContentRendered(object sender, EventArgs e)
{
this.Close();
}
}
uj5u.com熱心網友回復:
環境:Win 10 + VS2010uj5u.com熱心網友回復:
close 也只是close,不是Dispose對比一下
xxxForm x=new xxxForm()
x.show();
x.close()
x.show()
你看到了,show顯示了,close關閉,然后我又show了,這說明啥,說明這個x本身存在
所以你需要做的一件事情是,告訴gc我不用了
x.Dispose()
x=null
uj5u.com熱心網友回復:
WPF的視窗,沒有Dispose() 方法呀轉載請註明出處,本文鏈接:https://www.uj5u.com/net/276503.html
上一篇:Lamda運算式主從表資料提取
