图像控制中的WPF内存泄漏
我创建了一个简单的示例来测试图像控件的内存处理。 dockpanel上有两个按钮(“加载”和“重置”)和一个图像控件。 在代码隐藏中,按钮的事件处理程序如下所示:图像控制中的WPF内存泄漏,wpf,image,memory,memory-leaks,Wpf,Image,Memory,Memory Leaks,我创建了一个简单的示例来测试图像控件的内存处理。 dockpanel上有两个按钮(“加载”和“重置”)和一个图像控件。 在代码隐藏中,按钮的事件处理程序如下所示: private void LoadButton_Click(object sender, RoutedEventArgs e) { var dlg = new OpenFileDialog { Title = "Open image file",
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();
}
当我加载第一个图像时,内存使用量会增加。按下重置按钮,内存被正确释放。到目前为止,这看起来是正确的行为。
但是,如果我不“重置”,而是加载另一个图像,内存使用就会增加。
“重置”仅释放最新图像的内存。
如何确保在加载下一个图像时释放先前加载图像的内存
我使用的图像是应用程序。分辨率为300dpi的4000 x 1000 px。是否尝试在LoadButton\u Click中调用GC.Collect()?我稍微修改了示例:当为“bi”使用局部变量时,当单击“重置”按钮时,内存完全释放。但是“Load”中的GC.Collect()调用没有任何区别。当一个接一个地加载多个图像时,之前加载的图像的内存直到我点击“重置”才会释放。我想在自定义图像控件中使用上述代码,使用绑定来设置当前图像。当图像控件接收到空文件或null时,我需要释放内存。您是否修复过此问题?我也有同样的问题。加载18位MapImage使我的内存达到1GB。有没有一种好方法可以只在图像显示时将其加载到内存中?@Andrewaron:这取决于你想要什么。WPF中已有一个用于简单虚拟化列表的控件。这将是虚拟化StackPanel,只在一个方向上列出项目。如果您需要更多功能,例如虚拟化面板,可以在网上找到许多单个实现的示例。