10

我正在尝试使用缓存应用程序块来缓存一些图像(这些图像需要很长时间才能呈现)

  BitmapSource bitmapSource; ///some bitmap source already created
  _cache ///  Caching Application Block
  String someId; //id for this image, used as the key for the cache

  using (var stream = new MemoryStream())
    {
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Interlace = PngInterlaceOption.On;
        encoder.Frames.Add(BitmapFrame.Create(bitmapSource));             
        encoder.Save(stream);
        _cache.Add(someId, stream);
    }

然后使用以下方法加载它们:

imStream = (Stream)_cache.GetData(someId));
if (imStream != null)
{
    PngBitmapDecoder decoder = new PngBitmapDecoder(imStream,  BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
    return decoder.Frames[0];  //return the bitmap source
}

但是在加载过程中,我在“new PngBitmapDecoder”行出现以下异常:

“无法访问已关闭的流。

我知道我在上面的代码中关闭了流,但是 _cache.Add() 不是在它退出之前复制(通过序列化)吗?序列化流的正确过程是什么?

谢谢!

4

2 回答 2

9

问题是流Dispose()在块的末尾关闭(通过)using。您保留对封闭流的引用。

相反,将流的内容保存到缓存中:

_cache.Add(someId, stream.ToArray());

当您调用PngBitmapDecoder构造函数时,您必须创建一个新MemoryStream的以从该字节数组中读取。

于 2010-02-25T04:56:05.050 回答
6

但 _cache.Add() 不是在退出之前制作副本(通过序列化)吗?

不必要。如果它是“正在进行中”,它将只存储对象引用;Stream无论如何都不是非常可序列化(aStream是软管,而不是桶)。

您要存储 BLOB - 而不是Stream

    _cache.Add(someId, stream.ToArray());

...

byte[] blob = _cache.GetData(someId);
if(blob != null) {
    using(Stream inStream = new MemoryStream(blob)) {
         // (read)
    } 
}
于 2010-02-25T04:55:29.903 回答