Cuando agrega un artículo al System.Web.Caching.Cache
con una fecha de vencimiento absoluta, como en el siguiente ejemplo, ¿cómo se comporta Asp.Net? Lo hace:¿Cuándo elimina Asp.Net los elementos caché caducados?
Simplemente marca el artículo como expirado, a continuación, ejecutar el
CacheItemRemovedCallback
en el siguiente intento de acceso?¿Quitar el elemento del caché y ejecutar el
CacheItemRemovedCallback
inmediatamente?HttpRuntime.Cache.Insert(key, new object(), null, DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, OnCacheRemove);
MSDN parece indicar que sucede inmediatamente. Por ejemplo, the "Expiration" section of the "ASP.NET Caching Overview" dice "ASP.NET elimina automáticamente elementos de la caché cuando caducan". De forma similar, el ejemplo del tema "How to: Notify an Application When an Item Is Removed from the Cache" dice "Si transcurren más de 15 segundos entre llamadas a GetReport
[un método en el ejemplo], ASP.NET elimina el informe de la memoria caché".
Aún así, ninguno de estos es inequívoco. No dicen "la devolución de llamada se ejecuta inmediatamente" y podría concebir cómo sus escritores podrían haber pensado que la opción 1 anterior cuenta como 'eliminar' un elemento. Así que hice una prueba rápida y sucia, y he aquí, parece que se está ejecutando de inmediato: recibo devoluciones de llamada regulares de sesenta segundos, incluso cuando nadie está accediendo a mi sitio.
No obstante, mi prueba fue rápida y sucia, y en los comentarios a mi respuesta al Is there a way to run a process every day in a .Net web application without writing a windows service or SQL server jobs, alguien ha sugerido que Asp.Net realmente difiere la eliminación y ejecución de la devolución de llamada hasta que algo intente acceder al caché nuevamente.
¿Alguien puede resolver esto de manera autoritaria o esto simplemente se considera un detalle de implementación?
No creo que pueda haber una respuesta autorizada a esa pregunta porque, como a Raymond Chen le gusta señalar tan a menudo, usted interpreta el comportamiento de una versión de software para ser autorizada para todas las versiones futuras. En mi experiencia, esta es una mala idea ya que ASP.NET podría cambiar su comportamiento en cualquier momento y romper su aplicación. – dkackman
¿por qué no lo prueba? En su retrollamada, escriba en un archivo y vea la fecha de creación y cómo se relaciona con la caducidad. –
@dkackman - No necesito una respuesta "ahora y siempre", estoy dispuesto a conformarme con respuestas autorizadas para .NET 2.0 y 3.5. No parece ser solo un detalle de implementación para mí: esperaría que la documentación dijera en alguna parte que la eliminación real no es determinista si ese fuera el caso. Tal vez MS no está de acuerdo. Solo estoy tratando de ver si acabo de pasar por alto algo en la documentación. –