Подтвердить что ты не робот

Истечение кэшированного элемента через CacheItemPolicy в .NET MemoryCache

Я запутался в свойстве AbsoluteExpiration на CacheItemPolicy.

Документация MSDN для него говорит: "Период времени, который должен пройти до того, как будет выведена запись в кэш". Он использует System.DateTimeOffset для определения "периода времени".

Но если вы посмотрите документацию DateTimeOffset MSDN, в нем говорится, что она представляет собой момент времени... относительно скоординированного универсального времени (УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ). "Ссылка также на этот qaru.site/info/237814/....

Вы видите проблему? AbsoluteExpiration ожидает "период времени" (например, 5 секунд или 2 часа), но для этого требуется объект, который представляет собой "момент времени" (например, 21 декабря 2012 г., 06:14:00 EST).

В приведенном ниже коде я определяю единую политику для всех элементов. Я хочу, чтобы каждый элемент истекал cacheExpiryInSeconds секунд после их добавления. Может ли кто-то проверить, что я делаю это правильно?

public class MyCache : IRoutingInfoCache
{
    MemoryCache _routingInfoCache;
    CacheItemPolicy _cachePolicy;


    public MyCache(int cacheExpiryInSeconds)
    {
        _routingInfoCache = new MemoryCache("myCache");
        _cachePolicy = new CacheItemPolicy() {
            AbsoluteExpiration = 
                new DateTimeOffset(
                    DateTime.UtcNow.AddSeconds(cacheExpiryInSeconds))
        };
    }


    public void Put(string key, object cacheItem)
    {
        // based on how I constructed _cachePolicy, will this item expire
        // in cacheExpiryInSeconds seconds?
        _routingInfoCache.Add(new CacheItem(key, cacheItem), _cachePolicy);
    }
}
4b9b3361

Ответ 1

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

Ваш код не будет работать так, как ожидалось, так как ваше абсолютное истечение будет до, когда ваш элемент кэша будет введен один раз cacheExpiryInSeconds секунд, в результате выселения немедленного. Вы не можете использовать экземпляр CacheItemPolicy, когда AbsoluteExpiration установлен в ближайшем будущем, и это раздражает.:)