【发布时间】:2012-03-09 16:27:34
【问题描述】:
我在使用 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();
}
令人费解 - 有什么想法吗???
【问题讨论】:
-
Taskmgr 是一个非常不完美的内存分析器,垃圾收集器和 Windows 内存管理器都太复杂了,不能用一个数字来猜测。通过运行此代码一百万次来证明您确实遇到了问题。
-
我已经更新了我的代码,希望能更准确地显示正在发生的事情。我怀疑我原来按比例缩小的代码没有准确地重现我遇到的问题。
-
@DavidePiras 谢谢,但我不确定需要处理哪些托管资源以及如何处理。
-
@Phil 这是在窗口 xaml 中定义的图像(见上面的编辑)