При написании обработчика / модуля http необходимо реализовать член интерфейса - bool IsReusable .
Какое значение имеет этот член? Если я установлю для него значение false (или true), что это означает для остальной части веб-приложения?
При написании обработчика / модуля http необходимо реализовать член интерфейса - bool IsReusable .
Какое значение имеет этот член? Если я установлю для него значение false (или true), что это означает для остальной части веб-приложения?
Ответы:
Обычной точкой входа для обработчика является метод ProcessRequest. Однако у вас может быть код в конструкторе класса, который объединяет некоторые значения экземпляров, создание которых требует больших затрат.
Если вы укажете Reusable как true, приложение может кэшировать экземпляр и повторно использовать его в другом запросе, просто вызывая его метод ProcessRequest снова и снова, без необходимости каждый раз восстанавливать его.
Приложение создаст столько обработчиков, сколько необходимо для обработки текущей нагрузки.
Обратной стороной является то, что, если количество необходимых экземпляров больше, чем количество экземпляров, имеющихся в настоящее время, они приводят к использованию большего объема памяти. И наоборот, они также могут уменьшить видимое использование памяти, поскольку их значение экземпляра выдержит циклы сборки мусора и не требует частого перераспределения.
Еще одно предостережение: вы должны быть уверены, что в конце выполнения ProcessRequest состояние объекта будет таким, как вы хотели бы, чтобы другой запрос повторно использовал объект.
В дополнение к ответу AnthonyWJones ШЕРСТИ, если ваш HTTP обработчик возвращает true
для IsReusable
то вы должны убедиться , что она полностью поточно-.
В документации нет ничего, что указывало бы на то, что повторно используемые обработчики не могут использоваться повторно одновременно, хотя текущие реализации Microsoft, похоже, повторно используют их только последовательно. Но, по крайней мере теоретически, один экземпляр обработчика может быть повторно использован одновременно несколькими запросами, поэтому вам не следует полагаться на какие-либо данные, которые могут быть изменены другими параллельными потоками.
IsReusable
необходимости обеспечения безопасности потоков кажется противоречащим ответу AnthonyWJones. Насколько я понимаю, его третий абзац (приложение будет создавать как можно больше из ...), повторно используемый экземпляр обработчика не будет повторно использоваться одновременно, а только после завершения его текущей обработки. Если это правда, то нет необходимости быть потокобезопасным.
Если вы не храните какое-либо состояние в этом экземпляре (то есть: у вас нет полей (также называемых «переменные класса»)), вы можете безопасно использовать его повторно.
По умолчанию false на всякий случай.