Ура для Отражатель !
Истекшие элементы кэша фактически удалены (и вызваны обратные вызовы), если либо:
1) Что-то пытается получить доступ к элементу кэша.
2) Метод ExpiresBucket.FlushExpiredItems
запускается и попадает в элемент. Этот метод жестко запрограммирован на выполнение каждые 20 секунд (принятый ответ на вопрос StackOverflow Изменение частоты истечения срока действия элемента кэша ASP.NET подтверждает мое чтение этого кода с помощью Reflector). Однако для этого требуется дополнительная квалификация (для чего читайте дальше).
Asp.Net поддерживает один кэш для каждого процессора на сервере (я не уверен, представляют ли они логические или физические процессоры); каждый из них поддерживает экземпляр CacheExpires
, имеющий соответствующий Timer
, который вызывает свой метод FlushExpiredItems
каждые двадцать секунд.
Этот метод выполняет последовательную итерацию по другому набору «сегментов» данных об истечении срока действия кэша (массив ExpiresBucket
экземпляров) последовательно, вызывая метод каждого сегмента FlushExpiredItems
по очереди.
Этот метод (ExpiresBucket.FlushExpiredItems
) сначала выполняет итерацию всех элементов кэша в корзине, и, если срок действия элемента истек, отмечается, что он истек. Затем (я сильно упрощаю здесь) он перебирает элементы, которые он пометил, истек, и удаляет их, выполняя CacheItemRemovedCallback
(фактически, он вызывает CacheSingle.Remove
, который вызывает CacheInternal.DoRemove
, затем CacheSingle.UpdateCache
, затем CacheEntry.Close
, который фактически вызывает обратный вызов).
Все это происходит последовательно, поэтому есть вероятность, что что-то может заблокировать весь процесс и задержать его (и отодвинуть срок действия элемента кэша назад по сравнению с его указанным временем истечения).
Однако при этом временном разрешении с минимальным интервалом истечения в двадцать секунд единственной частью процесса, которая может блокироваться в течение значительного промежутка времени, является выполнение CacheItemRemovedCallbacks
. Любой из них может блокировать поток Timer
FlushExpiredItems
на неопределенный срок. (Хотя через двадцать секунд Timer
породит еще один FlushExpiredItems
поток.)
Подводя итог, можно сказать, что Asp.Net не гарантирует , что он будет выполнять обратные вызовы в указанное время, но при определенных условиях. Пока интервалы истечения находятся на расстоянии более двадцати секунд, и пока кэш не должен выполнять длительное время CacheItemRemovedCallbacks
(глобально - любые обратные вызовы могут потенциально помешать другим), он может выполнять обратные вызовы истечения на график. Это будет достаточно для некоторых приложений, но не подходит для других.