我能处理掉这条流吗?

本文关键字:处理 | 更新日期: 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.

是一种很好的做法。