2011-05-19 12 views
14

estoy tratando de añadir elementos a la instancia MemoryCache.Default utilizando como a continuación el método Add:MemoryCache.Add devuelve verdadero, pero no añadir el artículo a almacenar en caché

bool result= MemoryCache.Default.Add(cacheKey, dataToCache, cacheItemPolicy) 

El valor del resultado es verdadero, lo que indica que el elemento se ha agregado a la memoria caché, pero cuando intento recuperarlo inmediatamente después, la memoria caché está vacía. También intenté agregar el artículo usando el método Set con el mismo resultado de un caché vacío.

La memoria caché tiene el límite de memoria predeterminado de 99 Mb, por lo que no parece que no haya espacio para agregar elementos nuevos.

¿Alguna idea?


private static void InsertCachedData(string cacheKey, object dataToCache, string[] dependantCacheKeys) 
    { 
     CacheItemPolicy cacheItemPolicy = new CacheItemPolicy(); 

     cacheItemPolicy.AbsoluteExpiration = new DateTimeOffset(DateTime.Now, new TimeSpan(hours: 0, minutes: 0, seconds: 3600)); 

     if (dependantCacheKeys != null && dependantCacheKeys.Length > 0) 
     { 
      cacheItemPolicy.ChangeMonitors.Add(MemoryCache.Default.CreateCacheEntryChangeMonitor(dependantCacheKeys)); 
     } 

     MemoryCache.Default.Add(cacheKey, dataToCache, cacheItemPolicy); 

     logger.DebugFormat("Cache miss for VehiclesProvider call with key {0}", cacheKey); 
    } 
+0

¿Qué ajustes se 'cacheItemPolicy' usando? – LukeH

+0

+3,600 segundos y absoluteExpiration = true. – Jason

Respuesta

24

No está configurando correctamente la propiedad AbsoluteExpiration.

El TimeSpan argumento que se pasa a la DateTimeOffset constructor debe ser el desplazamiento de UTC del DateTime valor pasado, no algún intervalo de tiempo arbitrario que desea agregar a generar su desplazamiento. Usted está aprobando 3600 segundos, es decir, una hora, que funciona por pura coincidencia porque, presumiblemente, tiene su sede en el Reino Unido, donde BST está actualmente una hora por delante de UTC.

Está pasando DateTime.Now como el argumento DateTime, por lo que lo que está haciendo efectivamente es configurar el elemento almacenado en caché para caducar inmediatamente.

Si desea que su elemento almacenado en caché para vivir durante una hora a continuación, establecer la expiración de esta manera:

cacheItemPolicy.AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddHours(1)); 
+0

Spot on, gracias Luke. – Jason

+7

Sugeriría usar DateTimeOffset.UtcNow.AddHours (1). DateTime.Now es lento debido a la necesidad de calcular la hora local, y MemoryCache ignora la hora local de todos modos. –

0

¿Es posible que esté configurando de la política AbsoluteExpiration a un cero, o muy pequeña, DateTimeOffset?

+0

Se establece en +3,600 segundos, por lo que no debería ser eso. – Jason

+0

¿Qué tipo es cacheKey? –

+0

cacheKey es una cadena. – Jason

Cuestiones relacionadas