我能处理掉这条流吗?
本文关键字:处理 | 更新日期: 2023-09-27 18:03:15
我的WPF应用程序中有以下转换器:
[ValueConversion(typeof(byte[]), typeof(ImageSource))]
public class ReturnLabelImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var byteArray = value as byte[];
if (byteArray == null)
return new BitmapImage();
return BuildReturnLabelImageSource(byteArray);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public static ImageSource BuildReturnLabelImageSource(byte[] image)
{
if (image == null)
return null;
var imgBrush = new BitmapImage
{
CacheOption = BitmapCacheOption.OnLoad,
CreateOptions = BitmapCreateOptions.PreservePixelFormat
};
imgBrush.BeginInit();
imgBrush.StreamSource = ConvertImageToMemoryStream(image);
imgBrush.EndInit();
return imgBrush;
}
public static MemoryStream ConvertImageToMemoryStream(byte[] img)
{
var ms = new MemoryStream(img);
return ms;
}
}
我的代码审阅者给了我应该处理流的建议。我不太清楚该怎么做;我想到的最好的主意是:
public static ImageSource BuildReturnLabelImageSource(byte[] image)
{
if (image == null)
return null;
var imgBrush = new BitmapImage
{
CacheOption = BitmapCacheOption.OnLoad,
CreateOptions = BitmapCreateOptions.PreservePixelFormat
};
using (var stream = ConvertImageToMemoryStream(image))
{
imgBrush.BeginInit();
imgBrush.StreamSource = stream;
imgBrush.EndInit();
return imgBrush;
}
}
我在这里的轨道是正确的,或者我应该做不同的?
BitmapImage的文档。StreamSource说:
设置CacheOption属性为BitmapCacheOption。如果您希望在BitmapImage创建后关闭流,请OnLoad。默认的OnDemand缓存选项保留对流的访问,直到需要位图,并且清理由垃圾收集器处理。
由于您相应地设置了CacheOption
, imgBrush
应该不再需要访问EndInit
之后的流(至少,这就是我如何解释引用的段落),因此您的代码在我看来是正确的。
PS:是的,处置所有IDisposable
是很好的做法,但是,在您的情况下,它只是一个内存流。与文件流或数据库连接相比,内存流没有任何需要释放的非托管资源。事实上,根据参考源,MemoryStream.Dispose
所做的只是确保在您尝试再次读取它时抛出异常,因此我不会因此而失去任何睡眠。
内部,
EndInit()
函数将调用
FinalizeCreation()
从流中加载数据(如果设置了)。然后你就可以毫无畏惧地处理你的记忆流了。通常,显式地处理ref.