Значение bool IsReusable в интерфейсе обработчика http

130

При написании обработчика / модуля http необходимо реализовать член интерфейса - bool IsReusable .

Какое значение имеет этот член? Если я установлю для него значение false (или true), что это означает для остальной части веб-приложения?

GurdeepS
источник

Ответы:

152

Обычной точкой входа для обработчика является метод ProcessRequest. Однако у вас может быть код в конструкторе класса, который объединяет некоторые значения экземпляров, создание которых требует больших затрат.

Если вы укажете Reusable как true, приложение может кэшировать экземпляр и повторно использовать его в другом запросе, просто вызывая его метод ProcessRequest снова и снова, без необходимости каждый раз восстанавливать его.

Приложение создаст столько обработчиков, сколько необходимо для обработки текущей нагрузки.

Обратной стороной является то, что, если количество необходимых экземпляров больше, чем количество экземпляров, имеющихся в настоящее время, они приводят к использованию большего объема памяти. И наоборот, они также могут уменьшить видимое использование памяти, поскольку их значение экземпляра выдержит циклы сборки мусора и не требует частого перераспределения.

Еще одно предостережение: вы должны быть уверены, что в конце выполнения ProcessRequest состояние объекта будет таким, как вы хотели бы, чтобы другой запрос повторно использовал объект.

AnthonyWJones
источник
2
Вы упоминаете повторное использование объекта как ключевую оптимизацию, достигаемую путем указания IsReusable = True. Установка IsReusable = False приведет к тому, что сервер никогда не будет создавать экземпляры нескольких экземпляров обработчика. IE - устраняет ли он одновременные запросы?
Ян
@Ian Я считаю, что тогда он функционирует как обычная страница, когда многократное использование ложно, хотя я могу ошибаться. При повторном использовании он может обрабатывать 6 одновременных запросов с 2 или 3 экземплярами (только пример), тогда как, когда он не может использоваться повторно, ему потребуются экземпляры / процессы 1: 1. Я не могу представить .Net позволил бы запросам накапливаться, поскольку 1 рабочий поток пытался все это обработать, постоянно обновляя / повторно инициализируя свое состояние.
DavidScherer
47

В дополнение к ответу AnthonyWJones ШЕРСТИ, если ваш HTTP обработчик возвращает trueдля IsReusableто вы должны убедиться , что она полностью поточно-.

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

LukeH
источник
Извините за то, что был толстым, но не мог бы кто-нибудь уточнить, что подразумевается под «переключением контекста». Если вы обращаетесь к вещам из сеанса или строки запроса (content.Request.QueryString), можно ли это использовать повторно или нет?
zod
5
Переключение контекста - это когда ЦП прекращает обработку в одном потоке и начинает обработку в другом. Т.е. процессор переключил контекст с одного потока на другой. Это происходит постоянно на ПК, это создавало иллюзию многозадачности до появления многоядерных компьютеров.
Ларри Дюкек,
Я не мог понять, когда ты сказал, что в любой момент может быть переключение контекста . Когда мы набираем url и нажимаем Enter, выполняется один запрос за раз. право ?
Переключение контекста будет проблемой, когда несколько пользователей используют приложение одновременно. Например, если два пользователя хотят обновить одну и ту же запись одновременно, переключение контекста может вызвать проблемы.
Ishmael Smyrnow
7
Это утверждение о IsReusableнеобходимости обеспечения безопасности потоков кажется противоречащим ответу AnthonyWJones. Насколько я понимаю, его третий абзац (приложение будет создавать как можно больше из ...), повторно используемый экземпляр обработчика не будет повторно использоваться одновременно, а только после завершения его текущей обработки. Если это правда, то нет необходимости быть потокобезопасным.
Frédéric
3

Если вы не храните какое-либо состояние в этом экземпляре (то есть: у вас нет полей (также называемых «переменные класса»)), вы можете безопасно использовать его повторно.

По умолчанию false на всякий случай.

Андрей Рыня
источник