【问题标题】:Disposing a memory stream properly (WPF Image Conversion)正确处理内存流(WPF 图像转换)
【发布时间】:2015-11-04 21:48:09
【问题描述】:

谁能告诉我如何最好地处理内存流?以前,我有这个,一切正常:

MemoryStream strmImg = new MemoryStream(profileImage.Image);
BitmapImage myBitmapImage = new BitmapImage();
myBitmapImage.BeginInit();
myBitmapImage.StreamSource = strmImg;
myBitmapImage.DecodePixelWidth = 200;
myBitmapImage.DecodePixelWidth = 250;
myBitmapImage.EndInit();
this.DemographicInformation.EmployeeProfileImage = myBitmapImage;

后来我意识到,当MemoryStream 实现IDisposable 时,我会发生内存泄漏,并且应该在我使用它后将其处理掉,这导致了我这个实现:

using(MemoryStream strmImg = new MemoryStream(profileImage.Image))
{
    BitmapImage myBitmapImage = new BitmapImage();
    myBitmapImage.BeginInit();
    myBitmapImage.StreamSource = strmImg;
    myBitmapImage.DecodePixelWidth = 200;
    myBitmapImage.DecodePixelWidth = 250;
    myBitmapImage.EndInit();
    this.DemographicInformation.EmployeeProfileImage = myBitmapImage;
}

问题出在这行代码中:

 myBitmapImage.StreamSource = strmImg;

我的假设是这是引用内存位置,并且 dispose 显然会清理该位置,并且它在过去有效,因为它从未被正确处理。

我的问题是,我如何使用MemoryStream 并在使用后正确处理它,同时仍然保留我需要的转换数据(Image)?

【问题讨论】:

  • 请注意,Dispose MemoryStream 是一种很好的做法(只是因为它是 Disposable),但如果您不这样做,它实际上不会泄漏。特别是,Dispose 实际上并没有释放内存。只有当 GC 收集 MemoryStream 时才会发生这种情况。由于 BitmapImage 保留了对 MemoryStream 的引用,所以在收集到 BitmapImage 之前无法收集。

标签: c# .net wpf image


【解决方案1】:

你需要添加这一行:

myBitmapImage.CacheOption = BitmapCacheOption.OnLoad;

在加载时将整个图像缓存到内存中。如果没有这一行,CacheOption 属性的默认值为OnDemand,它会保留对流的访问权,直到需要图像为止。所以你的代码应该是:

using(MemoryStream strmImg = new MemoryStream(profileImage.Image))
{
    BitmapImage myBitmapImage = new BitmapImage();
    myBitmapImage.BeginInit();
    myBitmapImage.CacheOption = BitmapCacheOption.OnLoad;
    myBitmapImage.StreamSource = strmImg;
    myBitmapImage.DecodePixelWidth = 200;
    myBitmapImage.DecodePixelWidth = 250;
    myBitmapImage.EndInit();
    this.DemographicInformation.EmployeeProfileImage = myBitmapImage;
}

【讨论】:

  • 效果很好。谢谢!
猜你喜欢
  • 2016-03-17
  • 2011-06-05
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多