Utworzyłem pamięć podręczną przy użyciu klasy MemoryCache. Dodaje do niego kilka pozycji, ale kiedy muszę ponownie załadować pamięć podręczną, chcę ją najpierw wyczyścić. Jaki jest najszybszy sposób na zrobienie tego? Czy powinienem przejrzeć wszystkie elementy i usuwać je pojedynczo, czy jest lepszy sposób?
100
Odpowiedzi:
Dispose
istniejący MemoryCache i utwórz nowy obiekt MemoryCache.źródło
Dispose
nie stosował żadnychCacheEntryRemovedCallback
przypisane do bieżącej pozycji buforowane.Problem z wyliczeniem
Sekcja Remarks MemoryCache.GetEnumerator () ostrzega: „Pobieranie modułu wyliczającego dla wystąpienia MemoryCache jest operacją intensywnie wykorzystującą zasoby i blokującą. Dlatego moduł wyliczający nie powinien być używany w aplikacjach produkcyjnych”.
Oto dlaczego , wyjaśnione w pseudokodzie implementacji GetEnumerator ():
Ponieważ implementacja dzieli pamięć podręczną na wiele obiektów Dictionary, musi połączyć wszystko w jedną kolekcję, aby zwrócić moduł wyliczający. Każde wywołanie GetEnumerator wykonuje pełny proces kopiowania opisany powyżej. Nowo utworzony słownik zawiera odniesienia do oryginalnego klucza wewnętrznego i obiektów wartości, więc rzeczywiste wartości danych w pamięci podręcznej nie są duplikowane.
Ostrzeżenie w dokumentacji jest prawidłowe. Unikaj GetEnumerator () - w tym wszystkie powyższe odpowiedzi, które używają zapytań LINQ.
Lepsze i bardziej elastyczne rozwiązanie
Oto skuteczny sposób czyszczenia pamięci podręcznej, który po prostu opiera się na istniejącej infrastrukturze monitorowania zmian. Zapewnia również elastyczność czyszczenia całej pamięci podręcznej lub tylko nazwanego podzbioru i nie powoduje żadnego z omówionych powyżej problemów.
źródło
Z http://connect.microsoft.com/VisualStudio/feedback/details/723620/memorycache-class-needs-a-clear-method
Sposób obejścia:
źródło
Select()
?źródło
Jeśli wydajność nie jest problemem, ten fajny, jednoliniowy tekst załatwi sprawę:
źródło
Wygląda na to, że istnieje metoda przycinania .
Aby wyczyścić całą zawartość, którą po prostu zrobiłbyś
EDYCJA: po dłuższym kopaniu wydaje się, że zaglądanie do Trim nie jest warte twojego czasu
https://connect.microsoft.com/VisualStudio/feedback/details/831755/memorycache-trim-method-doesnt-evict-100-of-the-items
Jak wyczyścić System.Runtime.Caching.MemoryCache
źródło
Możesz też zrobić coś takiego:
źródło
Przebiegłem przez to i na tej podstawie napisałem nieco bardziej efektywną, równoległą przejrzystą metodę:
źródło
Byłem zainteresowany tylko wyczyszczeniem pamięci podręcznej i znalazłem to jako opcję, używając c # GlobalCachingProvider
źródło
nieco ulepszona wersja odpowiedzi magritte.
źródło
Możesz usunąć pamięć podręczną MemoryCache.Default, a następnie ponownie ustawić singleton pola prywatnego na null, aby ponownie utworzył MemoryCache.Default.
źródło