J'ai créé un cache en utilisant la classe MemoryCache. J'y ajoute quelques éléments, mais lorsque j'ai besoin de recharger le cache, je veux d'abord l'effacer. Quelle est la manière la plus rapide de procéder? Dois-je parcourir tous les éléments et les supprimer un par un ou y a-t-il un meilleur moyen?
100
Réponses:
Dispose
le MemoryCache existant et créez un nouvel objet MemoryCache.la source
Dispose
cela invoque toutCacheEntryRemovedCallback
attaché aux éléments actuels en cache.Le problème de l'énumération
La section Notes de MemoryCache.GetEnumerator () avertit: "La récupération d'un énumérateur pour une instance de MemoryCache est une opération de blocage et gourmande en ressources. Par conséquent, l'énumérateur ne doit pas être utilisé dans les applications de production."
Voici pourquoi , expliqué dans le pseudocode de l'implémentation GetEnumerator ():
Étant donné que l'implémentation divise le cache entre plusieurs objets Dictionary, elle doit tout rassembler dans une seule collection afin de rendre un énumérateur. Chaque appel à GetEnumerator exécute le processus de copie complet détaillé ci-dessus. Le dictionnaire nouvellement créé contient des références aux objets clé et valeur internes d'origine, de sorte que vos valeurs de données mises en cache réelles ne sont pas dupliquées.
L'avertissement dans la documentation est correct. Évitez GetEnumerator () - y compris toutes les réponses ci-dessus qui utilisent des requêtes LINQ.
Une solution meilleure et plus flexible
Voici un moyen efficace de vider le cache qui s'appuie simplement sur l'infrastructure de surveillance des changements existante. Il offre également la flexibilité de vider le cache entier ou juste un sous-ensemble nommé et ne présente aucun des problèmes évoqués ci-dessus.
la source
Depuis http://connect.microsoft.com/VisualStudio/feedback/details/723620/memorycache-class-needs-a-clear-method
La solution de contournement est:
la source
Select()
fait pour vous?la source
Si les performances ne sont pas un problème, ce joli one-liner fera l'affaire:
la source
Il semble qu'il existe une méthode Trim .
Donc pour effacer tout le contenu que vous venez de faire
EDIT: après avoir creusé un peu plus, il semble que regarder dans Trim ne vaut pas votre temps
https://connect.microsoft.com/VisualStudio/feedback/details/831755/memorycache-trim-method-doesnt-evict-100-of-the-items
Comment effacer un System.Runtime.Caching.MemoryCache
la source
Vous pouvez également faire quelque chose comme ceci:
la source
J'ai couru à travers cela et, sur cette base, a écrit une méthode claire et parallèle légèrement plus efficace:
la source
Je n'étais intéressé que par l'effacement du cache et j'ai trouvé cela comme une option, lors de l'utilisation du c # GlobalCachingProvider
la source
une version un peu améliorée de la réponse magritte.
la source
Vous pouvez supprimer le cache MemoryCache.Default, puis redéfinir le singleton de champ privé sur null, pour qu'il recrée le MemoryCache.Default.
la source