我正在尝试使用 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”行出现以下异常:
"Cannot access a closed Stream.
我知道我在上面的代码中关闭了流,但是 _cache.Add() 不是在它退出之前制作副本(通过序列化)吗?序列化流的正确过程是什么?
谢谢!
最佳答案
问题是流在 using
block 的末尾关闭(通过 Dispose()
)。您保留对已关闭流的引用。
相反,将流的内容保存到缓存中:
_cache.Add(someId, stream.ToArray());
当您调用 PngBitmapDecoder
构造函数时,您必须创建一个新的 MemoryStream
以从该字节数组中读取数据。
关于c# - 无法访问已关闭的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2331675/