图像控件中的WPF内存泄漏

时间:2014-01-21 09:41:30

标签: wpf image memory memory-leaks

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

0 个答案:

没有答案