图像控制中的WPF内存泄漏

图像控制中的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",

我创建了一个简单的示例来测试图像控件的内存处理。 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();

}
当我加载第一个图像时,内存使用量会增加。按下重置按钮,内存被正确释放。到目前为止,这看起来是正确的行为。 但是,如果我不“重置”,而是加载另一个图像,内存使用就会增加。 “重置”仅释放最新图像的内存。 如何确保在加载下一个图像时释放先前加载图像的内存


我使用的图像是应用程序。分辨率为300dpi的4000 x 1000 px。

是否尝试在LoadButton\u Click中调用GC.Collect()?我稍微修改了示例:当为“bi”使用局部变量时,当单击“重置”按钮时,内存完全释放。但是“Load”中的GC.Collect()调用没有任何区别。当一个接一个地加载多个图像时,之前加载的图像的内存直到我点击“重置”才会释放。我想在自定义图像控件中使用上述代码,使用绑定来设置当前图像。当图像控件接收到空文件或null时,我需要释放内存。您是否修复过此问题?我也有同样的问题。加载18位MapImage使我的内存达到1GB。有没有一种好方法可以只在图像显示时将其加载到内存中?@Andrewaron:这取决于你想要什么。WPF中已有一个用于简单虚拟化列表的控件。这将是虚拟化StackPanel,只在一个方向上列出项目。如果您需要更多功能,例如虚拟化面板,可以在网上找到许多单个实现的示例。