.NET 4 ObjectCache - Можем ли мы подключиться к событию «Срок действия кэша истек»? - PullRequest
14 голосов
/ 05 октября 2011

У меня есть простой объект, который кэшируется следующим образом:

_myCache.Add(someKey, someObj, policy);

Где _myCache объявлено как ObjectCache (но введено через DI как MemoryCache.Default), someObj - этообъект, который я добавляю, и policy - это CacheItemPolicy.

Если у меня есть CacheItemPolicy, подобный этому:

var policy = new CacheItemPolicy 
{ 
   Priority = CacheItemPriority.Default, 
   SlidingExpiration = TimeSpan.FromHours(1)
};

Это означает, что срок его действия истекает через 1 час.Круто.

Но что случится, так это то, что незадачливому первому пользователю через час придется ждать попадания.

Есть ли способ, которым я могу подключиться к "просроченному" событию / делегату иобновить кеш вручную?

Я вижу, что есть упоминание CacheEntryChangeMonitor, но не могу найти никаких значимых документов / примеров того, как его использовать в моем примере.

PS.Я знаю, что могу использовать CacheItemPriority.NotRemovable и истечь его вручную, но я не могу этого сделать в моем текущем примере, потому что кэшированные данные слишком сложны (например, мне нужно «сделать недействительными» примерно в 10 разных местах в моем коде).

Есть идеи?

Ответы [ 2 ]

14 голосов
/ 05 октября 2011

В CacheItemPolicy есть свойство с именем RemovedCallback, которое имеет тип: CacheEntryRemovedCallback.Не уверен, почему они не пошли по стандартному маршруту, но это должно делать то, что вам нужно.

http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.removedcallback.aspx

5 голосов
/ 16 апреля 2012

Поздно вечером с этим, но я только что заметил интересную разницу между обратными вызовами CacheItemUpdate и CacheItemRemove.

http://msdn.microsoft.com/en-us/library/system.web.caching.cacheitemupdatereason.aspx

В частности, этот комментарий:

В отличие от перечисления CacheItemRemovedReason, это перечисление не включает в себя удаленные или недоиспользуемые значения. Обновляемые элементы кэша не являются съемными и поэтому не могут быть автоматически удалены ASP.NET, даже если есть необходимость освободить память.

...