2010-02-25 15 views
9

Estoy intentando utilizar el Caching Application Block para almacenar en caché algunas imágenes (estas imágenes tardan mucho tiempo en procesarse)no pueden tener acceso cerrado Corriente

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); 
    } 

y luego cargarlos usando:

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 
} 

Pero durante la carga, obtengo la siguiente excepción en esa línea "nuevo PngBitmapDecoder":

"No se puede acceder a una transmisión cerrada.

Entiendo que cerré la transmisión en el código anterior, pero ¿_cache.Add() no está haciendo una copia (mediante Serialización) antes de que se cierre? ¿Cuál es el proceso correcto de serialización de la transmisión?

¡Gracias!

Respuesta

6

pero no _cache.Add() hacer una copia (mediante serialización) antes de que se cierre?

No necesariamente. Si está "en proceso", solo almacenará la referencia del objeto; Stream no es realmente muy serializable de todos modos (un Stream es una manguera, no un cubo).

desea almacenar el BLOB - no es el Stream:

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

... 

byte[] blob = _cache.GetData(someId); 
if(blob != null) { 
    using(Stream inStream = new MemoryStream(blob)) { 
     // (read) 
    } 
} 
+0

gracias! ambas buenas respuestas, acabo de marcar la que vino primero :) me gusta la referencia de host/cubo. – moogs

+2

@moogs - en realidad este vino primero (04:55:29 vs 04:46:05). – Alconja

+0

que fue raro ... el "contestó xx minutos atrás" fue más alto para esta publicación anterior. hmm. – moogs

9

El problema es que la corriente está cerrado (a través de Dispose()) al final del bloque using. Usted conserva una referencia a la transmisión cerrada.

En su lugar, guardar el contenido de la corriente a la memoria caché:

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

Cuando se llama al constructor PngBitmapDecoder, usted tiene que crear una nueva MemoryStream para leer a partir de ese conjunto de bytes.

Cuestiones relacionadas