He creado un caché usando la clase MemoryCache. Le agrego algunos elementos, pero cuando necesito recargar el caché, primero quiero borrarlo. ¿Cuál es la forma más rápida de hacer esto? ¿Debo recorrer todos los elementos y eliminarlos uno a la vez o hay una manera mejor?
100
Respuestas:
Dispose
MemoryCache existente y cree un nuevo objeto MemoryCache.fuente
Dispose
hace invocar ningunaCacheEntryRemovedCallback
unido a los elementos almacenados en caché actuales.El problema de la enumeración
La sección Comentarios de MemoryCache.GetEnumerator () advierte: "Recuperar un enumerador para una instancia de MemoryCache es una operación de bloqueo y que consume muchos recursos. Por lo tanto, el enumerador no debe usarse en aplicaciones de producción".
Este es el motivo , explicado en pseudocódigo de la implementación GetEnumerator ():
Dado que la implementación divide la caché en varios objetos Dictionary, debe reunir todo en una sola colección para poder devolver un enumerador. Cada llamada a GetEnumerator ejecuta el proceso de copia completo detallado arriba. El Diccionario recién creado contiene referencias a la clave interna original y a los objetos de valor, por lo que sus valores de datos almacenados en caché reales no se duplican.
La advertencia en la documentación es correcta. Evite GetEnumerator (), incluidas todas las respuestas anteriores que usan consultas LINQ.
Una solución mejor y más flexible
Esta es una forma eficiente de borrar la caché que simplemente se basa en la infraestructura de monitoreo de cambios existente. También proporciona la flexibilidad de borrar todo el caché o solo un subconjunto con nombre y no tiene ninguno de los problemas discutidos anteriormente.
fuente
De http://connect.microsoft.com/VisualStudio/feedback/details/723620/memorycache-class-needs-a-clear-method
La solución alternativa es:
fuente
Select()
?fuente
Si el rendimiento no es un problema, este buen resumen hará el truco:
fuente
Parece que hay un recorte método .
Entonces, para borrar todos los contenidos, simplemente harías
EDITAR: después de investigar un poco más, parece que no vale la pena dedicar tiempo a buscar en Trim
https://connect.microsoft.com/VisualStudio/feedback/details/831755/memorycache-trim-method-doesnt-evict-100-of-the-items
¿Cómo borro un System.Runtime.Caching.MemoryCache?
fuente
También puedes hacer algo como esto:
fuente
Me encontré con esto y, basándose en él, escribí un método claro paralelo ligeramente más efectivo:
fuente
Solo estaba interesado en borrar el caché y encontré esto como una opción, al usar c # GlobalCachingProvider
fuente
una versión un poco mejorada de magritte answer.
fuente
Puede deshacerse del caché MemoryCache.Default y luego restablecer el campo privado singleton en nulo, para que vuelva a crear el MemoryCache.Default.
fuente