Когда делает Asp. Сеть удаляет истекшие объекты кэша?

После поиска Интернета я нашел следующий Windows Forms FAQ

George Shepherd, который.Net библиотеки платформы не предоставляют Вам API для запросов для сфокусированного Управления. Необходимо вызвать окна API, чтобы сделать так:

[C#]

public class MyForm : Form
{
          [DllImport("user32.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.Winapi)]
          internal static extern IntPtr GetFocus();

          private Control GetFocusedControl()
          {
               Control focusedControl = null;
               // To get hold of the focused control:
               IntPtr focusedHandle = GetFocus();
               if(focusedHandle != IntPtr.Zero)
                    // Note that if the focused Control is not a .Net control, then this will return null.
                    focusedControl = Control.FromHandle(focusedHandle);
               return focusedControl;
          }
} 

20
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

Ура для Reflector !

Истекшие элементы кэша фактически удаляются (и вызываются обратные вызовы), когда:

1 ) Что-то пытается получить доступ к элементу кэша.

2) Метод ExpiresBucket.FlushExpiredItems запускается и переходит к элементу. Этот метод жестко запрограммирован на выполнение каждые 20 секунд (принятый ответ на вопрос StackOverflow Изменение частоты истечения срока действия элемента кэша ASP.NET подтверждает мое чтение этого кода через Reflector). Однако для этого требуется дополнительная квалификация (о которой читайте далее).


Asp.Net поддерживает один кеш для каждого процессора на сервере (I ' m не уверен, представляют ли они логические или физические процессоры); каждый из них поддерживает экземпляр CacheExpires , у которого есть соответствующий Timer , который вызывает свой метод FlushExpiredItems каждые двадцать секунд.

Этот метод выполняет итерацию по другой коллекции ' сегментов данных об истечении срока действия кэша (массив экземпляров ExpiresBucket ) последовательно, вызывая метод каждого сегмента FlushExpiredItems по очереди.

Этот метод ( ExpiresBucket.FlushExpiredItems ) сначала выполняет итерацию по всем элементам кэша в сегменте, и, если срок действия элемента истек, он отмечает, что срок его действия истек. Затем (я здесь сильно упрощаю) он выполняет итерацию по элементам, которые он пометил как просроченные, и удаляет их, выполняя CacheItemRemovedCallback (фактически, он вызывает CacheSingle.Remove , который вызывает CacheInternal.DoRemove , затем CacheSingle.UpdateCache , затем CacheEntry.Close , который фактически вызывает

Все это происходит последовательно, так что есть вероятность, что что-то может заблокировать весь процесс и задержать работу (и отодвинуть истечение срока действия элемента кэша назад по сравнению с указанным временем истечения срока действия).

Однако при таком временном разрешении , с минимальным интервалом истечения 20 секунд, единственная часть процесса, которая может заблокироваться на значительный период времени, - это выполнение CacheItemRemovedCallbacks . Любой из них предположительно может заблокировать поток данного Timer FlushExpiredItems на неопределенный срок. (Хотя через двадцать секунд Таймер порождает другой поток FlushExpiredItems .)

Подводя итог, Asp.Net не гарантирует , что он выполнит обратные вызовы в указанное время, но это будет происходить при определенных условиях. Пока интервалы истечения срока действия отличаются друг от друга более чем на двадцать секунд и пока кеш не должен выполнять трудоемкие CacheItemRemovedCallbacks (глобально - любые обратные вызовы потенциально могут мешать другим), он может выполнять обратные вызовы истечения срока действия по расписанию. Этого будет достаточно для некоторых приложений, но не для других.

но это произойдет при определенных условиях. Пока интервалы истечения срока действия отличаются друг от друга более чем на двадцать секунд и пока кеш не должен выполнять трудоемкие CacheItemRemovedCallbacks (глобально - любые обратные вызовы могут потенциально мешать другим), он может выполнять обратные вызовы истечения срока действия по расписанию. Этого будет достаточно для некоторых приложений, но не для других.

но это произойдет при определенных условиях. Пока интервалы истечения срока действия отличаются друг от друга более чем на двадцать секунд и пока кеш не должен выполнять трудоемкие CacheItemRemovedCallbacks (глобально - любые обратные вызовы потенциально могут мешать другим), он может выполнять обратные вызовы истечения срока действия по расписанию. Этого будет достаточно для некоторых приложений, но не для других.

38
ответ дан 29 November 2019 в 23:41
поделиться

Просроченные элементы не удаляются сразу из кеша, они просто помечаются как просроченные. Вы не получите обратный вызов, пока не пропадет кеш. Я столкнулся с этим еще в ASP.NET 1.1 дней, , и он не изменился .

Могут быть случаи, когда просроченные элементы удаляются немедленно - например, при нехватке памяти и высокой загрузке процессора - но на это нельзя рассчитывать.

Обычно я использую таймер, который регулярно перезагружает кеш.

5
ответ дан 29 November 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: