Wie lösche ich einen System.Runtime.Caching.MemoryCache
Verwende ich eine System.Runtime.Caching.MemoryCache
um Einzelteile zu halten, die nie abläuft. Doch manchmal brauche ich die Möglichkeit zum löschen des gesamten cache. Wie mache ich das?
Stellte ich eine ähnliche Frage hier über, ob ich könnte aufzählen des Caches, aber das ist eine schlechte Idee, wie es muss synchronisiert werden, während der enumeration.
Ich habe versucht, mit .Trim(100)
aber das funktioniert überhaupt nicht.
Habe ich versucht, immer eine Liste aller Tasten, die via Linq, aber dann bin ich wieder dort wo ich gestartet, weil entfernen von Elementen one-by-one kann leicht dazu führen, dass race-conditions.
Ich dachte zu speichern, die Schlüssel, und geben Sie dann einen .Remove(key)
für jeden, aber es gibt eine implizite race-condition gibt es auch, also ich bräuchte sperren, um den Zugriff auf der Liste der Schlüssel, und alles Durcheinander wieder.
Ich dann dachte, ich sollte in der Lage sein zu rufen .Dispose()
auf den gesamten cache, aber ich bin mir nicht sicher, ob dies der beste Ansatz, durch die Art, wie es umgesetzt.
Mit ChangeMonitors
ist nicht eine option für mein design, und ist unnecassarily Komplex für so eine triviale Anforderung.
So, wie ich komplett den cache löschen?
InformationsquelleAutor der Frage Peter Marks | 2011-11-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nicht rufen Sie dispose auf das Standardelement der MemoryCache wenn Sie wollen in der Lage sein, es zu benutzen mehr:
Über die Trim, soll es funktionieren:
Aber zwei andere Nutzer berichtet das es nicht funktioniert auf der gleichen Seite, so dass ich denke, Sie stecken mit Remove() http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.trim.aspx
Update
Aber ich sehe keine Erwähnung von ihm als singleton oder sonst unsicher ist, mehrere Instanzen haben, so dass Sie sollten in der Lage sein zu überschreiben Ihre Referenz.
Aber wenn Sie brauchen, um den Speicher frei von der Default-Instanz, die Sie haben, um es zu deaktivieren manuell oder zerstören Sie permanent über dispose (Rendern Sie unbrauchbar).
Basierend auf Ihre Frage, die Sie könnten Ihre eigenen singleton-imposante Klasse der Rückkehr einen Memorycache Sie können intern entsorgen zu werden.. die Natur einen cache 🙂
InformationsquelleAutor der Antwort stefan
War ich mit diesen zu kämpfen auf den ersten. MemoryCache.Standard.Trim(100) funktioniert nicht (wie besprochen). Trim ist ein bestes versucht, also, wenn es 100 Elemente im cache, und rufen Sie Trim(100) es wird entfernen Sie die, die am wenigsten genutzt wird.
Trim gibt die Anzahl der Elemente entfernt, und die meisten Menschen erwarten, entfernen Sie alle Elemente.
Dieser code entfernt alle Elemente aus MemoryCache für mich in meiner xUnit-tests mit MemoryCache.Standard. MemoryCache.Default ist die Standard-Region.
InformationsquelleAutor der Antwort Alexander Williamson
Hier ist, was ich gemacht hatte für etwas, das ich arbeiten war...
InformationsquelleAutor der Antwort Yasser
Details in @stefan die Antwort detail das Prinzip; hier ist, wie ich es tun würde.
Sollte man synchronisiert den Zugriff auf den cache, während neu zu erstellen, um zu vermeiden, das Rennen Zustand der client-code den Zugriff auf den cache, nachdem Sie es entsorgt, aber bevor Sie neu erstellt wird.
Um dies zu vermeiden synchronisation, das in der adapter-Klasse (die umschließt den MemoryCache):
Diese Weise
TheCache
ist immer in einem nicht-entsorgt Zustand, und keine synchronisation erforderlich ist.InformationsquelleAutor der Antwort Peter Marks
Ich lief in dieses problem auch. .Dispose() haben, etwas ganz anderes als das, was ich erwartet hatte.
Stattdessen habe ich noch ein statisches Feld, um meine controller-Klasse. Ich habe nicht mit den Standard-cache, um dieses Verhalten, sondern erstellt ein eigenes (wenn Sie es nennen wollen, dass). Also meine Umsetzung sah ein bisschen wie dieser:
InformationsquelleAutor der Antwort Richard Lander
Check-out diese post, und speziell, die Antwort, dass Thomas F. Abraham gepostet.
Es hat eine Lösung, mit der Sie zum löschen des gesamten cache oder einem benannten subset.
Das wichtigste hier ist:
Habe ich realisiert das selbst, und alles scheint zu funktionieren nur fine.
InformationsquelleAutor der Antwort Jowen