无法访问关闭的流
我正在尝试使用 缓存应用程序块 来缓存一些图像(这些图像需要很长时间才能渲染)
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() 不是在退出之前制作副本(通过序列化)吗?序列化流的正确过程是什么?
谢谢!
I'm trying to use the Caching Application Block to cache some images (these images take a long time to render)
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);
}
And then load them using:
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
}
But during the load, i get the following exception at that "new PngBitmapDecoder" line:
"Cannot access a closed Stream.
I understand I closed the stream in the above code, but isn't _cache.Add() making a copy (via Serialization) before it exits? What's the correct process of serializing the stream?
THanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题是流在
using
块末尾关闭(通过Dispose()
)。您保留对关闭流的引用。相反,将流的内容保存到缓存中:
当您调用
PngBitmapDecoder
构造函数时,您必须创建一个新的MemoryStream
来从该字节数组中读取。The problem is that the stream is closed (via
Dispose()
) at the end of theusing
block. You retain a reference to the closed stream.Instead, save the contents of the stream to your cache:
When you call the
PngBitmapDecoder
constructor, you'll have to create a newMemoryStream
to read from that byte array.未必。如果它是“正在处理”,它将只存储对象引用;无论如何,Stream 并不是真正可序列化的(
Stream
是软管,而不是桶)。您想要存储 BLOB - 而不是
Stream
:Not necessarily. If it is "in process" it will just store the object reference;
Stream
isn't really very serializable anyway (aStream
is a hose, not a bucket).You want to store the BLOB - not the
Stream
: