Там более простой ответ, чем то, что написал Smoak. Используя этот пример в качестве отправной точки, обновленный код ниже работает и не требует повторной вставки. Это работает потому, что классы являются ссылочными типами. Таким образом, когда вы обновляете счетчик внутри экземпляра класса, это не заставляет кеш инициировать обновление.

ню одно целочисленное значение в HttpContext.Cache с абсолютным временем истечения 5 минут. Однако после ожидания 6 минут (или дольше) целочисленное значение все еще находится в кэше (то есть оно никогда не удаляется, даже если истек абсолютный срок действия). Вот код, который я использую:

public void UpdateCountFor(string remoteIp)
{
    // only returns true the first time its run
    // after that the value is still in the Cache
    // even after the absolute expiration has passed
    // so after that this keeps returning false
    if (HttpContext.Current.Cache[remoteIp] == null)
    {
        // nothing for this ip in the cache so add the ip as a key with a value of 1
        var expireDate = DateTime.Now.AddMinutes(5);
        // I also tried:
        // var expireDate = DateTime.UtcNow.AddMinutes(5); 
        // and that did not work either.
        HttpContext.Current.Cache.Insert(remoteIp, 1, null, expireDate, Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
    }
    else
    {
        // increment the existing value
        HttpContext.Current.Cache[remoteIp] = ((int)HttpContext.Current.Cache[remoteIp]) + 1;
    }
}

При первом запуске UpdateCountFor ("127.0.0.1") он вставляет 1 в кэш с ключом "127.0.0.1" и истекает через 5 минут, как и ожидалось. Каждый последующий запуск увеличивает значение в кэше. Однако после 10 минут ожидания он продолжает увеличивать значение в кэше. Значение никогда не истекает и никогда не удаляется из кэша. Почему это?

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

Я ожидаю, что значение будет удалено из кеша через 5 минут, однако оно останется там до тех пор, пока я не перестрою проект.

Это все работает на .NET 4.0 на моей локальной машине.

Ответы на вопрос(3)

Ваш ответ на вопрос