MemoryCache в System.Runtime.Caching: срок действия элементов не истек

В настоящее время я пытаюсь вставить элементы в экземпляр MemoryCache.Default, который работает. Но предметы не истекают! Интервал опроса установлен по умолчанию: 2 минуты, никаких специальных настроек для MemoryCache не было.

Процедура добавления элемента выглядит следующим образом:

string key = "someKey";
var faultyItem = GetFaultyItemToBlockFromProcessingTheNextThreeMinutes();

if (!MemoryCache.Default.Contains(key))
{
    MemoryCache.Default.Add(
        new CacheItem(key, faultyItem),
        new CacheItemPolicy() 
        { 
            AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(3)
        });
}

Тем не менее, элементы никогда не истекают в кеше! Я ждал более 10 минут, и они все еще там в кеше. Основная цель состоит в том, чтобы предотвратить их заполнение базы данных запросами, пытаясь обрабатывать их каждые несколько секунд. Они проверяются каждые пару секунд, но не имеют SlidingExpiration. Они должны быть проверены снова примерно через 3 минуты, 5 минут, так как максимальная задержка все еще будет терпимой.

Я не хочу делать какие-либо настройки вне кода, в XML или тому подобное. Если это невозможно, есть ли хорошая альтернатива MemoryCache? Возможно с числовыми / объектными ключами и конфигурацией через параметры и свойства?

1 ответ

Я установил простое пробное приложение с нуля с фрагментом кода из вашего вопроса. Единственное изменение, которое я сделал, было следующее: var faultyItem = "test";

Надеть часы на утверждение MemoryCache.Default.Contains(key) подтверждает, что через 3 минуты этот элемент был удален из кэша, так как этот оператор возвратил false,

Одна возможность состоит в том, что где-то еще в вашем приложении вы уже поместили элемент в MemoryCache, используя тот же ключ, у которого нет срока действия, поэтому он никогда не выпадает и никогда не обновляется новым элементом, который имеет окончание срока действия Помимо поиска в приложении, одним из способов проверки этого будет использование именованного кэша вместо кэша по умолчанию для этой конкретной операции, чтобы определить потенциальное совместное использование. т.е. static MemoryCache testCache = new MemoryCache("TestCache"),

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