Не может получить доступ к закрытому потоку

Я пытаюсь использовать Блок Программы кэширования для кэширования некоторых изображений (эти изображения занимают много времени для рендеринга),

  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. Добавьте () создание копии (через Сериализацию), прежде чем это выйдет? Каков корректный процесс сериализации потока?

Спасибо!

10
задан moogs 25 February 2010 в 04:36
поделиться

2 ответа

но разве _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)
    } 
}
6
ответ дан 3 December 2019 в 22:36
поделиться

но не делает ли _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 для чтения из этого байтового массива.

9
ответ дан 3 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: