MemoryCache.Add возвращает true, но не добавляет элемент в кеш
Я пытаюсь добавить элементы в экземпляр MemoryCache.Default, используя метод Add, как показано ниже:
bool result= MemoryCache.Default.Add(cacheKey, dataToCache, cacheItemPolicy)
Значение результата равно true, что указывает на то, что элемент был добавлен в кеш, но когда я попытаюсь получить его сразу после этого, кеш пуст. Я также попытался добавить элемент с помощью метода Set с тем же результатом пустого кеша.
В кеше установлен предел памяти по умолчанию 99 МБ, поэтому он не отображается, если нет места для добавления новых элементов.
Любые идеи?
private static void InsertCachedData(string cacheKey, object dataToCache, string[] dependantCacheKeys)
{
CacheItemPolicy cacheItemPolicy = new CacheItemPolicy();
cacheItemPolicy.AbsoluteExpiration = new DateTimeOffset(DateTime.Now, new TimeSpan(hours: 0, minutes: 0, seconds: 3600));
if (dependantCacheKeys != null && dependantCacheKeys.Length > 0)
{
cacheItemPolicy.ChangeMonitors.Add(MemoryCache.Default.CreateCacheEntryChangeMonitor(dependantCacheKeys));
}
MemoryCache.Default.Add(cacheKey, dataToCache, cacheItemPolicy);
logger.DebugFormat("Cache miss for VehiclesProvider call with key {0}", cacheKey);
}
Ответы
Ответ 1
Вы не правильно устанавливаете свойство AbsoluteExpiration
.
Аргумент TimeSpan
, который вы передаете конструктору DateTimeOffset
, должен быть смещением от UTC пройденного значения DateTime
а не какой-то произвольный промежуток времени, который вы хотите добавить, чтобы сгенерировать свое смещение. Вы проходите через 3600 секунд, т.е. Один час, который работает чисто по совпадению, потому что, предположительно, вы находитесь в Великобритании, где BST сейчас на час раньше UTC.
Вы передаете DateTime.Now
в качестве аргумента DateTime
, так что вы фактически делаете установку моментального кэширования элемента.
Если вы хотите, чтобы ваш кеш-объект работал в течение часа, установите время истечения так:
cacheItemPolicy.AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddHours(1));
Ответ 2
Возможно ли, что вы устанавливаете политику AbsoluteExpiration
на нулевую или очень маленькую, DateTimeOffset
?