我创建了一个简单的例子来测试图像控件的内存处理。 在dockpanel上有两个按钮(“加载”和“重置”)和一个图像控件。 在后面的代码中,按钮的事件处理程序如下所示:
private void LoadButton_Click(object sender, RoutedEventArgs e)
{
var dlg = new OpenFileDialog
{
Title = "Open image file",
DefaultExt = ".tif",
Filter = "",
Multiselect = false,
InitialDirectory = "D:\\testimages"
};
dlg.ShowDialog();
string file = dlg.FileName;
if (!string.IsNullOrEmpty(file))
{
if (this.img.Source != null)
{
this.img.Source = null;
this.img.UpdateLayout();
GC.Collect();
}
var bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.UriSource = new Uri(file);
bi.EndInit();
bi.Freeze();
this.img.Source = bi;
}
else
{
this.img.Source = null;
this.img.UpdateLayout();
GC.Collect();
}
}
private void ResetButton_Click(object sender, RoutedEventArgs e)
{
this.img.Source = null;
this.img.UpdateLayout();
GC.Collect();
}
当我加载第一张图像时,内存使用量会增加。按下Reset按钮,可以正确释放内存。到目前为止,这似乎是正确的行为。 但如果我不“重置”,但加载另一个图像,内存使用量会增加。 “重置”仅释放最新图像的内存。 如何在加载下一张图像时确保先前加载的图像的内存被释放?
我使用的图像是app。 4000 x 1000像素,分辨率为300dpi。