Когда вы добавляете элемент в System.Web.Caching.Cache
с абсолютной датой истечения срока действия, как в следующем примере, как ведет себя Asp.Net? Это:
-
Просто отметьте элемент как истек, затем выполните
CacheItemRemovedCallback
при следующей попытке доступа? -
Удалить элемент из кеша и немедленно выполнить
CacheItemRemovedCallback
?HttpRuntime.Cache.Insert(key, new object(), null, DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, OnCacheRemove);
MSDN указывает, что это происходит немедленно. Например, раздел "Истечение срока действия" "Обзор кэширования ASP.NET" говорит: "ASP.NET автоматически удаляет элементы из кеша, когда они истекает". Аналогично, пример из раздела "Как уведомлять приложение при удалении элемента из кэша" говорит "Если более 15 секунд проходит между вызовами GetReport
[метод в примере], ASP.NET удаляет отчет из кэша."
Тем не менее, ни одно из них не является однозначным. Они не говорят, что "обратный вызов выполняется немедленно", и я мог представить себе, как их авторы могли подумать, что вариант 1 выше считается "удалением" элемента. Поэтому я сделал быстрый и грязный тест, и вот, похоже, он выполняется немедленно - я получаю регулярные шестьдесят второго обратного вызова, даже когда никто не обращается к моему сайту.
Тем не менее, мой тест был быстрым и грязным, и в комментариях к моему ответу на Есть ли способ запускать процесс каждый день в веб-приложении .NET без написания окон служба или SQL-сервер, кто-то предположил, что Asp.Net фактически отменяет удаление и выполнение обратного вызова, пока что-то не попытается снова получить кэш.
Может ли кто-нибудь урегулировать это авторитетно или это просто рассматривается как деталь реализации?