2011-12-22 14 views
5

estoy usando la nueva biblioteca System.Runtime.Caching para almacenar en caché en mi solicitud, y se define como sigue en el App.config:System.Runtime.Caching no libera BitmapImage objetos

<system.runtime.caching> 
    <memoryCache> 
     <namedCaches> 
      <add name="MyCache" cacheMemoryLimitMegabytes="10" 
       physicalMemoryLimitPercentage="30" pollingInterval="00:00:10" /> 
     </namedCaches> 
    </memoryCache> 
</system.runtime.caching> 

Luego, a partir del código que crear una instancia de esta manera: _cache = new MemoryCache("MyCache");

y añadir entradas como esta: _cache.Add(resourceName, resource, new CacheItemPolicy());

puedo utilizar esta caché para almacenar BitmapImage objetos, y para asegurarse de que la memoria caché funciona correctamente, he añadido diez BitmapImage objetos a la memoria caché, cada uno con una imagen de aproximadamente 7 MB. Luego esperé diez segundos para que se efectuara el sondeo y revisé las entradas en el caché, pero estaban todas allí. Ni un solo objeto ha sido desalojado.

¿Estoy haciendo algo mal aquí? Sé que la configuración se lee correctamente desde App.config. ¿Es posible que las instancias BitmapImage sean pequeñas y solo hagan referencia a la imagen en el disco? ¿Y cómo determina el caché cuál es el tamaño del objeto?

Respuesta

3

Esto se debe a que va a agregar a la caché con

new CacheItemPolicy() 

Esto anulará sus valores y darle los valores por defecto, que es una de AbsoluteExpiration 31/12/9999 11:59:59 pm 00 : 00

de hacerlo durante 10 minutos tienes 2 opciones

CacheItemPolicy item = new CacheItemPolicy(); 

item.SlidingExpiration = new TimeSpan(0, 10, 0); 

o

item.AbsoluteExpiration = DateTime.Now.AddMinutes(10); 

Si elige la expiración deslizante, los 10 minutos se restablecerán si actualiza el objeto.

+0

He probado esto con 'char []', y los elementos fueron desalojados aunque utilicé 'new CacheItemPolicy()'. De cualquier manera, para agregar un elemento a la caché, tengo que proporcionar un parámetro 'CacheItemPolicy'. ¿Qué valor debo pasar para obtener el comportamiento solicitado? –

+0

Actualizado mi respuesta –

+0

Esto todavía no me da el comportamiento solicitado. No quiero establecer explícitamente el momento en que los artículos caducarán; quiero que caduquen si se excedió el límite de memoria, como se define en 'app.config'. Además, estoy bastante seguro de que te equivocas sobre los artículos que expiran al 31/12/9999 11:59:59 PM +00: 00, porque como dije en mi comentario anterior, conseguí que los artículos caduquen incluso cuando los agregó con la política 'new CacheItemPolicy()'. –

Cuestiones relacionadas