2010-11-29 42 views
7

dans ASP.NET Caching ressemble, il utilise une sorte de tableau associatif:Looping par clés dans l'objet de cache ASP.NET

// Insert some data into the cache: 
Cache.Insert("TestCache", someValue); 
// Retrieve the data like normal: 
someValue = Cache.Get("TestCache"); 

// But, can be done associatively ... 
someValue = Cache["TestCache"]; 

// Also, null checks can be performed to see if cache exists yet: 
if(Cache["TestCache"] == null) { 
    Cache.Insert(PerformComplicatedFunctionThatNeedsCaching()); 
} 
someValue = Cache["TestCache"]; 

Comme vous pouvez le voir, effectuer une vérification nulle sur l'objet du cache est très utile .

Mais je voudrais mettre en œuvre une fonction d'effacement de cache qui peut effacer les valeurs de cache où je ne connais pas le entier nom de clé. Comme il semble y avoir un tableau associatif ici, il devrait être possible (?)

Quelqu'un peut-il me aider à trouver un moyen de boucle à travers les clés du cache stockées et exécuter une logique simple sur eux? Voici ce que je suis après:

static void DeleteMatchingCacheKey(string keyName) { 
    // This foreach implementation doesn't work by the way ... 
    foreach(Cache as c) { 
     if(c.Key.Contains(keyName)) { 
      Cache.Remove(c); 
     } 
    } 
} 
+0

Le cache est sous votre contrôle - pourquoi voudriez-vous pas connaître les noms des choses qui sont là-dedans? –

Répondre

5

Ne pas utiliser une boucle foreach lors du retrait des éléments de toute collection type- la boucle foreach repose sur l'utilisation d'un recenseur qui ne vous permettra pas de supprimer des éléments de la collection (la l'énumérateur lève une exception si la collection sur laquelle il itère a des éléments ajoutés ou supprimés).

Utilisez un simple tout en boucle sur les clés du cache au lieu:

int i = 0; 
while (i < Cache.Keys.Length){ 
    if (Cache.Keys(i).Contains(keyName){ 
     Cache.Remove(Cache.Keys(i)) 
    } 
    else{ 
     i ++; 
    } 
} 
+0

Est-ce thread-safe? Que se passe-t-il si un autre thread modifie le cache (par exemple ajouter et/ou supprimer des éléments du cache) pendant que ce code est en cours d'exécution? –

+1

La classe Cache est thread-safe donc ce code ne lèvera pas une exception. Toutefois, il peut ne pas supprimer tous les éléments du cache si Cache.Add() est appelé après la dernière vérification de Cache.Keys.Length. – WiseGuyEh

+4

Je ne suis pas en mesure de résoudre Cache.Keys – theusguy