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
risposta
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
Perché il downvote? Non posso migliorare se non mi dici dove mi sbaglio. –
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
Grazie per le informazioni. –
è possibile enumerare attraverso gli oggetti:
System.Web.HttpContext.Current.Cache.GetEnumerator()
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
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
.
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.
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);
}
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);
}
Grazie a tutti per il tuo feedback impressionante. Non avrei mai pensato che ci sarebbero stati molti buoni modi. Upvotes per tutti! Grazie – Jeff