Я создал кеш с помощью класса MemoryCache. Я добавляю в него несколько элементов, но когда мне нужно перезагрузить кеш, я хочу сначала его очистить. Как это сделать быстрее всего? Должен ли я перебирать все элементы и удалять их по одному или есть лучший способ?
100
Ответы:
Dispose
существующий MemoryCache и создайте новый объект MemoryCache.источник
Dispose
делает вызвать любойCacheEntryRemovedCallback
приложенные к текущим пунктам кэшированных.Проблема с перечислением
В разделе «Замечания» MemoryCache.GetEnumerator () предупреждается: «Получение перечислителя для экземпляра MemoryCache является ресурсоемкой и блокирующей операцией. Следовательно, перечислитель не следует использовать в производственных приложениях».
Вот почему , объясненное в псевдокоде реализации GetEnumerator ():
Поскольку реализация разделяет кеш на несколько объектов Dictionary, она должна собрать все вместе в единую коллекцию, чтобы вернуть перечислитель. Каждый вызов GetEnumerator выполняет процесс полного копирования, описанный выше. Вновь созданный Словарь содержит ссылки на исходные объекты внутреннего ключа и значения, поэтому ваши фактические значения кэшированных данных не дублируются.
Предупреждение в документации верное. Избегайте GetEnumerator () - включая все приведенные выше ответы, в которых используются запросы LINQ.
Лучшее и более гибкое решение
Вот эффективный способ очистки кеша, который просто основан на существующей инфраструктуре мониторинга изменений. Он также обеспечивает гибкость для очистки либо всего кеша, либо только указанного подмножества и не имеет никаких проблем, описанных выше.
источник
Из http://connect.microsoft.com/VisualStudio/feedback/details/723620/memorycache-class-needs-a-clear-method
Обходной путь:
источник
Select()
делает реализация ?источник
Если производительность не является проблемой, то этот хороший однострочный текст поможет:
источник
Вроде есть метод Trim .
Итак, чтобы очистить все содержимое, вам просто нужно сделать
РЕДАКТИРОВАТЬ: покопавшись еще немного, кажется, что изучение Trim не стоит вашего времени
https://connect.microsoft.com/VisualStudio/feedback/details/831755/memorycache-trim-method-doesnt-evict-100-of-the-items
Как очистить System.Runtime.Caching.MemoryCache
источник
Вы также можете сделать что-то вроде этого:
источник
Пробежавшись по этому поводу, на его основе написал чуть более эффективный метод параллельной очистки:
источник
Меня интересовала только очистка кеша, и я нашел это как вариант при использовании c # GlobalCachingProvider
источник
немного улучшенная версия ответа Магритта.
источник
Вы можете избавиться от кеша MemoryCache.Default, а затем переустановить синглтон частного поля на null, чтобы он воссоздал MemoryCache.Default.
источник