Могу ли я перебирать память .NET4 MemoryCache?

Я использую кеш, предоставленный System.Runtime.Caching.MemoryCache.

Я бы хотел перечислить элементы кэша, чтобы я мог аннулировать (вытеснять, а затем перезагружать) элементы как таковые

foreach (var item in MemoryCache.Default) { item.invalidate() }

Но официальные документы найдены здесь state:

! Важно: получение перечислителя для экземпляра MemoryCache является ресурсоемкие и блокирующие операции. Поэтому перечислитель должен не используются в производственных приложениях.

Неужели должен быть простой и эффективный способ перебора элементов кэша?

Ответ 1

Предложения, сделанные до сих пор, были замечательными, но моя потребность по-прежнему заявлена: для итерации элементов кэша. Кажется, такая простая задача, и я ожидаю, что внутри кэша внутри есть какая-то структура списка. Требуются документы и набор функций для MemoryCache.

Итак, как обсуждалось выше, я добавил список к классу адаптера кэша, который содержит ссылку на каждый элемент, который я размещаю в кеше. Если мне нужно перебирать кеш - не только для недействительности, но и для сбора статистики и т.д. - тогда я перебираю свой список.

Если количество элементов, помещенных в кеш, не изменяется, это разумное решение. Если номер изменяется, вам необходимо вставить/удалить через класс адаптера, чтобы сохранить список в синхронизации с фактическим кешем. Бесполезно, но он работает, и избегает первоочередных санкций, упомянутых в документах.

Надеюсь, что поставщик кэширования MemoryCache будет скрыт в следующем выпуске платформы.

Ответ 2

Рассмотрите возможность использования ChangeMonitors, которые позволяют автоматически вычеркивать устаревшие записи при выполнении определенных условий.

См. Есть ли какая-то CacheDependency в System.Runtime.Caching?

Это похоже на System.Web.Caching CacheDependencys, которые позволяют вам выселять записи, когда файлы или другие записи кэша меняются.

Ответ 3

В 2014 году

Это правильный способ получить все элементы:

Dim AllItems = MemoryCache.Default.Select(Of ItemType)(Function(O) O.Value)

Надеюсь, это поможет кому-то.