Глядя на документацию для MemoryCache Я ожидал, что если бы объект был доступен в течение периода истечения срока, период был бы обновлен. Честно говоря, я думаю, что я вывел из названия "Скользящий" столько, сколько угодно.
Однако, как видно из этого теста
[Test]
public void SlidingExpiryNotRefreshedOnTouch()
{
var memoryCache = new MemoryCache("donkey")
{
{
"1",
"jane",
new CacheItemPolicy {SlidingExpiration = TimeSpan.FromSeconds(1) }
}
};
var enumerable = Enumerable.Repeat("1", 100)
.TakeWhile((id, index) =>
{
Thread.Sleep(100);
return memoryCache.Get(id) != null; // i.e. it still exists
})
.Select((id, index) => (index+2)*100.0/1000); // return the elapsed time
var expires = enumerable.Last(); // gets the last existing entry
expires.Should().BeGreaterThan(1.0);
}
Он терпит неудачу и демонстрирует поведение, которое объект выбрасывается после завершения TimeSpan независимо от того, был ли доступ к объекту. Запрос Linq выполняется в операторе enumerable.Last();, после чего он будет выполняться только в том случае, если кеш не истек. Как только он остановится, последний элемент в списке покажет, как долго элемент находился в кеше.
Для ясности Этот вопрос касается поведения MemoryCache. Не запрос linq.
Ожидается ли это еще одно ожидание (т.е. истечение не с каждым касанием)? Существует ли режим, который продлевает срок жизни объектов, которые "касаются"?
Обновить. Я нашел, даже если я написал обертку вокруг кеша и повторно добавил объект обратно в кеш каждый раз, когда я его получил, а другой SlidingExpiration по-прежнему только удостоил начальную настройку. Чтобы заставить его работать так, как я хотел, мне пришлось физически удалить его из кеша, прежде чем снова его добавить! Это может привести к нежелательным условиям гонки в многопоточной среде.