【发布时间】: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 之前无法收集。