2009-07-06 19 views
5

¿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

+0

Gracias a todos por su colaboración impresionante. Nunca pensé que habría tantas buenas maneras. ¡Votos favorables para todos! Gracias – Jeff

Respuesta

5

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 
+0

¿Por qué el voto a favor? No puedo mejorar si no me dices dónde estoy equivocado. –

+0

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

+0

Gracias por la información. –

6

Puede enumerar a través de los objetos:

System.Web.HttpContext.Current.Cache.GetEnumerator() 
3

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 
1

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.

1

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.

15
 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); 
     } 
2

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); 
    } 
Cuestiones relacionadas