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?