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

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

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


person GurdeepS    schedule 11.02.2009    source источник


Ответы (3)


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

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

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

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

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

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

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

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

person LukeH    schedule 11.02.2009
comment
Извините за то, что был толстым, но не мог бы кто-нибудь уточнить, что подразумевается под «переключением контекста». Если вы получаете доступ к вещам из сеанса или строки запроса (content.Request.QueryString), можно ли это использовать повторно или нет? - person zod; 09.06.2011
comment
Переключение контекста - это когда ЦП прекращает обработку в одном потоке и начинает обработку в другом. I.E. ЦП переключил контекст с одного потока на другой. Это происходит постоянно на ПК, это давало нам иллюзию многозадачности до появления многоядерных компьютеров. - person Larry Dukek; 26.09.2011
comment
Я не мог понять, когда вы сказали В любой момент может произойти переключение контекста. Когда мы вводим url и нажимаем Enter, выполняется один запрос за раз. правильно ? - person ; 24.05.2013
comment
Переключение контекста будет проблемой, когда несколько пользователей используют приложение одновременно. Например, если два пользователя хотят обновить одну и ту же запись одновременно, переключение контекста может вызвать проблемы. - person Ishmael Smyrnow; 13.06.2013
comment
Это утверждение о IsReusable необходимости обеспечения безопасности потоков кажется противоречащим ответу AnthonyWJones. Насколько я понимаю, его третий абзац (приложение будет создавать как можно больше из ...), повторно используемый экземпляр обработчика не будет повторно использоваться одновременно, а только после завершения его текущей обработки. Если это правда, то нет необходимости быть потокобезопасным. - person Frédéric; 04.07.2014
comment
@Frederic - вы правы в том смысле, что сам класс не обязательно должен быть потокобезопасным, поскольку на каждый экземпляр приходится 1 поток (при условии, что AWJ означает, что приложение создаст столько обработчиков, сколько необходимо для обработки текущей нагрузки. ). Однако я думаю, что Люк просто имел в виду, что общие ресурсы, к которым осуществляется доступ из выполнения ProcessRequest, должны быть потокобезопасными; например, если вы читаете и записываете статические / глобальные переменные. I.E. - если поток проверяет поле БД в начале запроса процесса, не предполагайте, что оно не будет изменено до того, как поток выйдет из обработчика. - person Ian; 11.11.2015
comment
@Ian, независимо от значения IsReusable, общие ресурсы должны обрабатываться потокобезопасным способом. Так что, даже если вы правильно догадались о том, что он хотел иметь в виду, все равно это выглядит неверным. - person Frédéric; 12.11.2015
comment
@Frederic, @Ian: документация для IHttpHandler а в IHttpHandlerFactory очень мало деталей. @Frederic прав в том, что реализации Microsoft по умолчанию, похоже, повторно используют обработчики только последовательно, а не одновременно [...] - person LukeH; 12.11.2015
comment
[...] но нетрудно представить (или написать) IHttpHandlerFactory реализацию, которая всегда обрабатывает один и тот же экземпляр одиночного обработчика, если IsReusable истинно. Насколько я могу судить, такая фабрика не нарушила бы контракт интерфейса, и в этой ситуации обработчик определенно можно было бы повторно использовать одновременно, и поэтому он должен был бы быть полностью потокобезопасным. - person LukeH; 12.11.2015
comment
Вы правы для IHttpHandler, глядя на документацию, нет никаких гарантий, что она не будет использоваться одновременно (интерфейс doc и IsReusable свойство doc). И полагаться на недокументированные функции небезопасно. На стороне IHttpHandlerFactory метод ReleaseHandler предполагает, что эта недокументированная функция является единственным «прогнозом» шаблона использования разработчиками интерфейсов. Это остается довольно слабым намеком. - person Frédéric; 12.11.2015
comment
В конце концов я прочитал этот вопрос (stackoverflow .com / questions / 5500950 /). Принятый ответ г-на Бранислова подразумевает, что возможно несколько потоков, одновременно выполняющих один и тот же экземпляр обработчика. Так что я просто буду писать код, предполагая это. Я предполагаю, что MS делает документацию расплывчатой, чтобы позже они могли изменить свою реализацию. - person Ian; 12.11.2015

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

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

person Andrei Rînea    schedule 10.12.2010