2009-07-06 12 views
5

C'è un modo per esaminare la cache per tutti gli oggetti nella cache? Sto creando oggetti dinamicamente e ho bisogno di scorrere periodicamente l'elenco per eliminare gli oggetti che non uso più.Elenco di oggetti in httpcontext.current.cache

+0

Grazie a tutti per il tuo feedback impressionante. Non avrei mai pensato che ci sarebbero stati molti buoni modi. Upvotes per tutti! Grazie – Jeff

risposta

5

Sì, è possibile indice basato sulla chiave di cache, oppure è possibile scorrere i contenuti:

For Each c In Cache 
    ' Do something with c 
Next 
' Pardon my VB syntax if it's wrong 
+0

Perché il downvote? Non posso migliorare se non mi dici dove mi sbaglio. –

+0

Non ho fatto down, ma devo guardare altre risposte per determinare quale sia la variabile "c" e come usarla, nel tuo esempio. Penso che tu abbia risposto al cuore della domanda, che è come elencare gli oggetti nella cache. – slolife

+0

Grazie per le informazioni. –

6

è possibile enumerare attraverso gli oggetti:

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

Ecco un VB funzione per scorrere la cache e restituire una rappresentazione 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

Dal momento che si vuole essere potenzialmente la rimozione di elementi dall'oggetto Cache, non è terribilmente comodo per scorrere su di esso (come IEnumerable), dal momento che questo non consente la rimozione durante il processo di iterazione. Tuttavia, dato che non è possibile accedere agli elementi per indice, è l'unica soluzione.

Un po 'di LINQ può tuttavia semplificare il problema. Provare qualcosa di simile al seguente:

var cache = HttpContext.Current.Cache; 
var itemsToRemove = cache.Where(item => myPredicateHere).ToArray(); 
foreach (var item in itemsToRemove) 
    cache.Remove(itemsToRemove.Key); 

Nota che ogni item nell'iterazione è di tipo DictionaryEntry.

1

Jeff, dovresti davvero cercare le dipendenze per gli elementi memorizzati nella cache. Questo è il modo corretto di farlo. Raggruppa in modo logico i tuoi dati (elementi) e le dipendenze di impostazione per i tuoi gruppi. In questo modo quando hai bisogno di espirare l'intero gruppo tocchi una dipendenza così comune e se ne sono andati tutti.

Non sono sicuro di aver compreso l'elenco di oggetto.

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

Questo può essere un po 'in ritardo, ma ho usato il seguente codice per scorrere facilmente sopra tutti gli elementi della cache ed eseguire una logica personalizzata per la rimozione di elementi della cache che contengono una certa stringa nel loro nome.

Ho fornito entrambe le versioni di codice in VB.Net e C#.

VB.Net Versione

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# versione

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); 
    } 
Problemi correlati