Могу ли я перебрать .NET4 MemoryCache? - PullRequest
19 голосов
/ 06 ноября 2011

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

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

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 06 ноября 2011

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

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

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

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

1 голос
/ 06 ноября 2011

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

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

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

0 голосов
/ 21 ноября 2014

В 2014 году

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...