Ich habe einen Cache mit der MemoryCache-Klasse erstellt. Ich füge einige Elemente hinzu, aber wenn ich den Cache neu laden muss, möchte ich ihn zuerst löschen. Was ist der schnellste Weg, dies zu tun? Sollte ich alle Elemente durchlaufen und einzeln entfernen, oder gibt es einen besseren Weg?
100
Antworten:
Dispose
den vorhandenen MemoryCache und erstellen Sie ein neues MemoryCache-Objekt.quelle
Dispose
tut jeder invokeCacheEntryRemovedCallback
den aktuellen Cache gespeicherten Elemente angebracht.Das Problem mit der Aufzählung
Der Abschnitt MemoryCache.GetEnumerator () Remarks warnt: "Das Abrufen eines Enumerators für eine MemoryCache-Instanz ist eine ressourcenintensive und blockierende Operation. Daher sollte der Enumerator nicht in Produktionsanwendungen verwendet werden."
Im Pseudocode der GetEnumerator () -Implementierung wird der folgende Grund erläutert:
Da die Implementierung den Cache auf mehrere Dictionary-Objekte aufteilt, muss alles in einer einzigen Sammlung zusammengefasst werden, um einen Enumerator zurückzugeben. Jeder Aufruf von GetEnumerator führt den oben beschriebenen vollständigen Kopiervorgang aus. Das neu erstellte Wörterbuch enthält Verweise auf die ursprünglichen internen Schlüssel- und Wertobjekte, sodass Ihre tatsächlich zwischengespeicherten Datenwerte nicht dupliziert werden.
Die Warnung in der Dokumentation ist korrekt. Vermeiden Sie GetEnumerator () - einschließlich aller obigen Antworten, die LINQ-Abfragen verwenden.
Eine bessere und flexiblere Lösung
Hier ist eine effiziente Methode zum Löschen des Caches, die einfach auf der vorhandenen Infrastruktur zur Änderungsüberwachung aufbaut. Es bietet auch die Flexibilität, entweder den gesamten Cache oder nur eine benannte Teilmenge zu löschen, und weist keines der oben diskutierten Probleme auf.
quelle
Von http://connect.microsoft.com/VisualStudio/feedback/details/723620/memorycache-class-needs-a-clear-method
Die Problemumgehung lautet:
quelle
Select()
Meinung nach?quelle
Wenn Leistung kein Problem ist, wird dieser nette Einzeiler den Trick machen:
quelle
Es scheint, dass es eine Trimmmethode gibt .
Um alle Inhalte zu löschen, müssen Sie dies nur tun
EDIT: Nach einigem Graben scheint es, dass es sich nicht lohnt, sich mit Trim zu beschäftigen
https://connect.microsoft.com/VisualStudio/feedback/details/831755/memorycache-trim-method-doesnt-evict-100-of-the-items
Wie lösche ich einen System.Runtime.Caching.MemoryCache?
quelle
Sie könnten auch so etwas tun:
quelle
Ich bin darauf gestoßen und habe darauf basierend eine etwas effektivere, parallele klare Methode geschrieben:
quelle
Ich war nur daran interessiert, den Cache zu leeren, und fand dies als Option, wenn ich den c # GlobalCachingProvider verwendete
quelle
eine etwas verbesserte version von magritte antwort.
quelle
Sie können den MemoryCache.Default-Cache entsorgen und dann den Singleton für das private Feld auf null zurücksetzen, damit der MemoryCache.Default neu erstellt wird.
quelle