2010-01-22 9 views
5

tengo una clase que contiene la siguiente propiedad:elemento de la caché nunca se expira

public Dictionary<string, int> CommentCounts { 
    get { 
     string cacheKey = "CommentCounts"; 
     HttpContext c = HttpContext.Current; 

     if (c.Cache[cacheKey] == null) { 
      c.Cache.Insert(cacheKey, new Dictionary<string, int>(), null, DateTime.UtcNow.AddSeconds(30), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.High, null); 
      c.Trace.Warn("New cached item: " + cacheKey); 
     } 

     return (Dictionary<string, int>)c.Cache[cacheKey]; 
    } 
    set { 
     HttpContext.Current.Cache["CommentCounts"] = value; 
    } 
} 

Parece que la sentencia trace sólo se ejecuta una vez, y no cada 30 segundos después de que el elemento en caché ha expirado. La única forma en que puedo obtener para actualizar el elemento en caché es hacer una oportunidad de código y reconstruir el proyecto, que obviamente es menos que ideal.

¿Qué me estoy perdiendo? Gracias de antemano ...

Respuesta

8

La parte set de la propiedad es probablemente la causa - Cache["key"] = value es equivalente a llamar Cache.Insert con NoAbsoluteExpiration, NoSlidingExpiration lo que significa que nunca caduca. La solución correcta se vería así:

public Dictionary<string, int> CommentCounts { 
    get { 
     const string cacheKey = "CommentCounts"; 
     HttpContext c = HttpContext.Current; 

     if (c.Cache[cacheKey] == null) CommentCounts = new Dictionary<string, int>(); 

     return (Dictionary<string, int>)c.Cache[cacheKey]; 
    } 
    set { 
     const string cacheKey = "CommentCounts"; 
     c.Cache.Insert(cacheKey, value, null, DateTime.UtcNow.AddSeconds(30), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.High, null); 
     c.Trace.Warn("New cached item: " + cacheKey); 
    } 
} 
+0

Eso tiene sentido. Dicho esto, ¿cuál es la mejor manera de actualizar el elemento en caché? – ianpoley

+0

Agregué el código modificado para la propiedad que debería funcionar como estaba previsto. –

+0

¡Bingo! Muchas gracias, eso funcionó como un encanto. – ianpoley

0

Tuve este problema antes y asked a question here; nunca fue realmente respondida, pero podría haber algunos consejos útiles para la eliminación de errores en las respuestas.

Cuestiones relacionadas