Liste des objets dans httpcontext.current.cache
-
23-08-2019 - |
Question
Est-il possible de regarder à travers le cache pour tous les objets du cache? Je crée dynamiquement des objets et je dois aller régulièrement dans la liste pour purger les objets que je ne suis plus à l'aide.
La solution
Oui, vous pouvez indexer en fonction de la clé de cache, ou vous pouvez vous itérer sur le contenu:
For Each c In Cache
' Do something with c
Next
' Pardon my VB syntax if it's wrong
Autres conseils
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);
}
Vous pouvez énumérer les objets:
System.Web.HttpContext.Current.Cache.GetEnumerator()
Voici une fonction de VB pour itérer à travers le cache et retourner une représentation 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
Cela peut être un peu en retard, mais j'utilisé le code suivant pour itérer facilement sur tous les éléments du cache et effectuer une logique personnalisée pour le retrait des éléments du cache qui contiennent une certaine chaîne en leur nom.
J'ai fourni les deux versions du code VB.Net ainsi que C #.
VB.Net Version
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 # Version
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);
}
Puisque vous voulez être potentiellement supprimer des éléments de la l'objet de Cache
, il est pas très pratique pour itérer dessus (comme IEnumerable
), car cela ne permet pas le retrait au cours du processus d'itération. Cependant, étant donné que vous ne pouvez pas accéder à des éléments par index, il est la seule solution.
Un peu de LINQ peut cependant simplifier le problème. Essayez quelque chose comme ce qui suit:
var cache = HttpContext.Current.Cache;
var itemsToRemove = cache.Where(item => myPredicateHere).ToArray();
foreach (var item in itemsToRemove)
cache.Remove(itemsToRemove.Key);
Notez que chaque item
dans l'itération est de type DictionaryEntry
.
Jeff, vous devriez regarder vraiment les dépendances pour vos articles mis en cache. C'est la bonne façon de le faire. Logiquement regroupez vos données mises en cache (éléments) et les dépendances de configuration pour vos groupes. De cette façon, lorsque vous avez besoin d'expirer tout le groupe que vous touchez une telle dépendance commune et ils sont tous partis.
Je ne suis pas sûr que je comprends Liste des objets partie.