我在使用WPF构建的程序中看到了巨大的内存泄漏。我写了一个小的示例应用程序,它似乎在较小的范围内复制了这个问题。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
images = Directory.GetFiles("C:\\Photos", "*.jpg",
SearchOption.TopDirectoryOnly);
foreach (string image in images)
{
Window1 window = new Window1(image);
window.Show();
window.Close();
}
}
}
Window1 XAML。 。
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"
AllowsTransparency="True"
WindowStyle="None"
Background="White"
Opacity="1.0"
<Grid>
<Image Name="pb_Image"/>
</Grid>
。 。 。和Window1代码
public Window1(string image)
{
InitializeComponent();
BitmapImage bi = new BitmapImage(new Uri(image, UriKind.Absolute));
bi.Freeze();
pb_Image.Source = bi;
pb_Image.Height = bi.Height;
pb_Image.Width = bi.Width;
}
它反复显示然后关闭一个包含BitmapImage
的窗口但是“内存不足异常”很快发生,所以我显然做错了什么并希望有人可以指出它!
*更新*
在玩了一段时间之后,我已经解决了这个问题,这会导致内存泄漏:
foreach (string image in images)
{
Window1 window = new Window1(image);
window.Show();
window.Close();
}
这不是
foreach (string image in images)
{
Window1 window = new Window1("C:\\Photos\\photo1.jpg");
window.Show();
window.Close();
}
令人费解 - 任何想法???
答案 0 :(得分:0)
关闭窗口后,您仍然可以参考窗口对象。在关闭它之后,您需要将window
设置为null。
答案 1 :(得分:0)
不确定为什么上面的内存泄漏正在发生,因为我可以确定,一切看起来都正确。
我确实设法找到了这个excellent tutorial on "WPF Multithreading - Using the BackgroundWorker and Reporting the Progress to the UI",它很容易适应循环并显示一组图像而没有任何内存泄漏问题。