¿Hay alguna manera de buscar en el caché todos los objetos del caché? Estoy creando objetos dinámicamente y necesito revisar periódicamente la lista para eliminar objetos que ya no utilizo.Lista de objetos en httpcontext.current.cache
Respuesta
Sí, puede índice basado en la clave de caché, o si se puede iterar sobre los contenidos:
For Each c In Cache
' Do something with c
Next
' Pardon my VB syntax if it's wrong
¿Por qué el voto a favor? No puedo mejorar si no me dices dónde estoy equivocado. –
No he votado negativamente, pero tengo que buscar otras respuestas para determinar qué es la variable "c" y cómo usarla, en su ejemplo. Creo que usted respondió el corazón de la pregunta, que es cómo enumerar los objetos en el caché. – slolife
Gracias por la información. –
Puede enumerar a través de los objetos:
System.Web.HttpContext.Current.Cache.GetEnumerator()
Aquí es un VB función para iterar a través del caché y devolver una representación de DataTable.
Private Function CreateTableFromHash() As DataTable
Dim dtSource As DataTable = New DataTable
dtSource.Columns.Add("Key", System.Type.GetType("System.String"))
dtSource.Columns.Add("Value", System.Type.GetType("System.String"))
Dim htCache As Hashtable = CacheManager.GetHash()
Dim item As DictionaryEntry
If Not IsNothing(htCache) Then
For Each item In htCache
dtSource.Rows.Add(New Object() {item.Key.ToString, item.Value.ToString})
Next
End If
Return dtSource
End Function
Puesto que usted quiere ser potencialmente eliminar elementos del objeto Cache
, que no es muy conveniente para iterar sobre ella (como un IEnumerable
), ya que este no permite la eliminación durante el proceso de iteración. Sin embargo, dado que no puede acceder a los elementos por índice, es la única solución.
Sin embargo, un poco de LINQ puede simplificar el problema. Pruebe algo como lo siguiente:
var cache = HttpContext.Current.Cache;
var itemsToRemove = cache.Where(item => myPredicateHere).ToArray();
foreach (var item in itemsToRemove)
cache.Remove(itemsToRemove.Key);
Tenga en cuenta que cada item
en la iteración es de tipo DictionaryEntry
.
Jeff, realmente debería buscar dependencias para sus elementos almacenados en caché. Esa es la forma correcta de hacer esto. Lógicamente, agrupe sus datos (elementos) en caché y configure las dependencias para sus grupos. De esta forma, cuando necesites vencer a todo el grupo, tocarás esa dependencia común y desaparecerán.
No estoy seguro de entender la Lista de objetos parte.
var keysToClear = (from System.Collections.DictionaryEntry dict in HttpContext.Cache
let key = dict.Key.ToString()
where key.StartsWith("Something_")
select key).ToList();
foreach (var key in keysToClear)
{
HttpContext.Cache.Remove(key);
}
Esto puede ser un poco tarde, pero se utiliza el siguiente código para iterar fácilmente sobre todos los elementos de la caché y realizar alguna lógica personalizada para la eliminación de elementos de caché que contienen una determinada cadena en sus nombres.
He proporcionado dos versiones de código en VB.Net y C#.
VB.Net Versión
Dim cacheItemsToRemove As New List(Of String)()
Dim key As String = Nothing
'loop through all cache items
For Each c As DictionaryEntry In System.Web.HttpContext.Current.Cache
key = DirectCast(c.Key, String)
If key.Contains("prg") Then
cacheItemsToRemove.Add(key)
End If
Next
'remove the selected cache items
For Each k As var In cacheItemsToRemove
System.Web.HttpContext.Current.Cache.Remove(k)
Next
C# versión
List<string> cacheItemsToRemove = new List<string>();
string key = null;
//loop through all cache items
foreach (DictionaryEntry c in System.Web.HttpContext.Current.Cache)
{
key = (string)c.Key;
if (key.Contains("prg"))
{
cacheItemsToRemove.Add(key);
}
}
//remove the selected cache items
foreach (var k in cacheItemsToRemove)
{
System.Web.HttpContext.Current.Cache.Remove(k);
}
- 1. HttpContext.Current.Cache vs. HttpRuntime.Cache
- 2. 'HttpContext.Current.Cache' con seguridad
- 3. Cómo devolver HttpContext.Current.Cache de WCF?
- 4. ¿HttpContext.Current.Cache es seguro para subprocesos?
- 5. HttpContext.Current.Cache - ¿Cuándo se borra esto automáticamente?
- 6. Crear una lista de objetos en Python
- 7. Representar una lista de objetos en XSD
- 8. Downcasting una lista de objetos en C#
- 9. string.join en una lista de objetos
- 10. creando lista de objetos en Javascript
- 11. Iterar la lista de objetos en Ibatis
- 12. Crear una lista de objetos en Python
- 13. Inyectar lista de objetos en CDI (Weld)
- 14. Ordenando una lista de objetos en C#
- 15. Almacenar objetos de trazado en una lista
- 16. Imprimir una lista de objetos
- 17. Usando LINQ al grupo una lista de objetos en una nueva lista agrupada de lista de objetos
- 18. Cómo convertir/convertir Lista de objetos a cola de objetos
- 19. Usando LINQ, seleccione la lista de objetos dentro de otra lista de objetos
- 20. Eliminar objetos duplicados en una lista (C#)
- 21. convertir la lista de objetos a la lista de interfaces
- 22. Múltiples objetos en la lista, C#
- 23. Filtrar una lista de objetos mediante la comparación con otra lista de los diferentes objetos
- 24. elemento de la lista contiene objetos de otra lista
- 25. Eliminar una lista de objetos de otra lista
- 26. MVC - Edición de una lista de objetos
- 27. Almacenamiento de una lista de objetos
- 28. extraer nombres de objetos de la lista
- 29. Crear lista de instancias de diferentes objetos
- 30. consulta LINQ entre dos objetos de lista
Gracias a todos por su colaboración impresionante. Nunca pensé que habría tantas buenas maneras. ¡Votos favorables para todos! Gracias – Jeff