Там более простой ответ, чем то, что написал 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 на моей локальной машине.