При написании обработчика / модуля http необходимо реализовать член интерфейса, называемый - bool IsReusable.
В чем значение этого члена? Если я установлю для него значение false (или true), что это будет значить для остальной части веб-приложения?
При написании обработчика / модуля http необходимо реализовать член интерфейса, называемый - bool IsReusable.
В чем значение этого члена? Если я установлю для него значение false (или true), что это будет значить для остальной части веб-приложения?
Обычной точкой входа для обработчика является метод ProcessRequest. Однако у вас может быть код в конструкторе класса, который объединяет некоторые значения экземпляров, создание которых требует больших затрат.
Если вы укажете Reusable как true, приложение может кэшировать экземпляр и повторно использовать его в другом запросе, просто вызывая его метод ProcessRequest снова и снова, без необходимости каждый раз восстанавливать его.
Приложение создаст столько обработчиков, сколько необходимо для обработки текущей нагрузки.
Обратной стороной является то, что если количество необходимых экземпляров больше, чем количество экземпляров, имеющихся в настоящее время, они вызывают использование большего объема памяти. И наоборот, они также могут уменьшить очевидное использование памяти, поскольку их значение экземпляра выдержит циклы сборки мусора и не требует частого перераспределения.
Еще одно предостережение: вы должны быть уверены, что в конце выполнения ProcessRequest состояние объекта будет таким, как вы хотели бы, чтобы другой запрос повторно использовал объект.
В дополнение к ответу AnthonyWJones, если ваш обработчик HTTP возвращает true
для IsReusable
, вы должны убедиться, что он полностью потокобезопасен.
В документации нет ничего, что указывало бы на то, что повторно используемые обработчики не могут использоваться повторно одновременно, хотя текущие реализации Microsoft, похоже, повторно используют их только последовательно. Но, по крайней мере теоретически, один экземпляр обработчика может быть повторно использован одновременно несколькими запросами, поэтому вам не следует полагаться на какие-либо данные, которые могут быть изменены другими параллельными потоками.
IsReusable
необходимости обеспечения безопасности потоков кажется противоречащим ответу AnthonyWJones. Насколько я понимаю, его третий абзац (приложение будет создавать как можно больше из ...), повторно используемый экземпляр обработчика не будет повторно использоваться одновременно, а только после завершения его текущей обработки. Если это правда, то нет необходимости быть потокобезопасным.
- person Frédéric; 04.07.2014
IsReusable
, общие ресурсы должны обрабатываться потокобезопасным способом. Так что, даже если вы правильно догадались о том, что он хотел иметь в виду, все равно это выглядит неверным.
- person Frédéric; 12.11.2015
IHttpHandler
а в IHttpHandlerFactory
очень мало деталей. @Frederic прав в том, что реализации Microsoft по умолчанию, похоже, повторно используют обработчики только последовательно, а не одновременно [...]
- person LukeH; 12.11.2015
IHttpHandlerFactory
реализацию, которая всегда обрабатывает один и тот же экземпляр одиночного обработчика, если IsReusable
истинно. Насколько я могу судить, такая фабрика не нарушила бы контракт интерфейса, и в этой ситуации обработчик определенно можно было бы повторно использовать одновременно, и поэтому он должен был бы быть полностью потокобезопасным.
- person LukeH; 12.11.2015
IHttpHandler
, глядя на документацию, нет никаких гарантий, что она не будет использоваться одновременно (интерфейс doc и IsReusable
свойство doc). И полагаться на недокументированные функции небезопасно. На стороне IHttpHandlerFactory
метод ReleaseHandler
предполагает, что эта недокументированная функция является единственным «прогнозом» шаблона использования разработчиками интерфейсов. Это остается довольно слабым намеком.
- person Frédéric; 12.11.2015
Если вы не сохраняете какое-либо состояние в этом экземпляре (т. Е. У вас нет полей (также называемых «переменными класса»)), вы должны быть в безопасности повторно использовать его.
По умолчанию false на всякий случай.