2009-02-11 4 views
124

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

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

+0

[Использование недвижимого имущества IHttpHandler.IsReusable в реальном мире] (http://stackoverflow.com/questions/10806214/ihttphandler-isreusable-property-truly-usages) –

ответ

146

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

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

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

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

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

+0

Вы упоминаете повторное использование объекта как ключевую оптимизацию, достигаемую путем указания IsReusable = True. Будет ли параметр IsReusable = False результатом на сервере, не создавая экземпляры нескольких экземпляров обработчика. И.Е. - он устраняет одновременные запросы? – Ian

44

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

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

+0

Извините за то, что вы толстый, но кто-нибудь может подумать о том, что подразумевается под «переключателем контекста». Если вы получаете доступ к вещам из строки sesson или запроса (content.Request.QueryString), это многократно используемое или нет? – zod

+4

Контекстное переключение - это когда CPU перестает обрабатывать один поток и начинает обработку на другом. И.Е. CPU переключил контекст из одного потока в другой. Это происходит постоянно на ПК, это дало нам иллюзию многозадачности, прежде чем появились многоядерные компьютеры. – TwistedStem

+0

Я не мог понять, когда вы сказали ** ** В любой момент может быть контекстный переключатель **. Когда мы вводим url и нажимаем enter, это выполняет один запрос за раз. правильно ? – 2013-05-24 04:51:26

3

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

Это по умолчанию ложно, чтобы быть в безопасности.

 Смежные вопросы

  • Нет связанных вопросов^_^