Я пытаюсь использовать Блок Программы кэширования для кэширования некоторых изображений (эти изображения занимают много времени для рендеринга),
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
}
Но во время загрузки, я получаю следующее исключение в том "новом PngBitmapDecoder" строка:
"Не может получить доступ к закрытому Потоку.
Я понимаю, что окружил поток вышеупомянутый код, но не являюсь _cache. Добавьте () создание копии (через Сериализацию), прежде чем это выйдет? Каков корректный процесс сериализации потока?
Спасибо!
но разве _cache.Add() не делает копию (через Serialization) перед выходом?
Не обязательно. Если он находится "в процессе", он просто сохранит ссылку на объект; Stream
в любом случае не очень сериализуем (Stream
- это шланг, а не ведро).
Вы хотите хранить BLOB - не Stream
:
_cache.Add(someId, stream.ToArray());
...
byte[] blob = _cache.GetData(someId);
if(blob != null) {
using(Stream inStream = new MemoryStream(blob)) {
// (read)
}
}
но не делает ли _cache.Add () копию (через сериализацию) перед ее выходом?
Необязательно. Если он находится «в процессе», он просто сохранит ссылку на объект; Поток
в любом случае не очень сериализуем ( Поток
- это шланг, а не ведро).
Требуется сохранить BLOB, а не поток
:
_cache.Add(someId, stream.ToArray());
...
byte[] blob = _cache.GetData(someId);
if(blob != null) {
using(Stream inStream = new MemoryStream(blob)) {
// (read)
}
}
-121--3133372- Проблема заключается в том, что поток закрыт (через Dispose ()
) в конце с помощью блока
. Ссылка на закрытый поток сохраняется.
Вместо этого сохраните содержимое потока в кэше:
_cache.Add(someId, stream.ToArray());
При вызове конструктора PngBitmapDecoder
необходимо создать новый MemureStream
для чтения из этого байтового массива.