代码之家  ›  专栏  ›  技术社区  ›  moogs

无法访问关闭的流

  •  9
  • moogs  · 技术社区  · 14 年前

    我正在尝试使用 Caching Application Block 缓存一些图像(这些图像需要很长时间才能呈现)

      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()在进行复制(通过序列化)吗?序列化流的正确过程是什么?

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  6
  •   Marc Gravell    14 年前

    但是,在退出之前,cache.add()不是在进行复制(通过序列化)吗?

    不一定。如果是“正在处理”,则只存储对象引用; Stream 无论如何,不是非常可序列化的(a 河流 是软管,不是水桶)。

    您要存储blob-而不是 河流 :

        _cache.Add(someId, stream.ToArray());
    
    ...
    
    byte[] blob = _cache.GetData(someId);
    if(blob != null) {
        using(Stream inStream = new MemoryStream(blob)) {
             // (read)
        } 
    }
    
        2
  •  9
  •   Ben M    14 年前

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

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

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

    当你打电话给 PngBitmapDecoder 构造函数,您必须创建一个新的 MemoryStream 从该字节数组中读取。