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

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

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

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

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

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

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

3 ответа

Решение

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

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

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

С надеждой MemoryCache поставщик кеша будет конкретизирован в следующем выпуске платформы.

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

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

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

В 2014,

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

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

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

Другие вопросы по тегам