Какая польза для IHttpHandler.IsReusable?

Я пишу IHttpHandler, и мне нужно реализовать свойство IsReusable. Когда я смотрю документацию MSDN, он говорит:

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

Это не очень полезно. В каких ситуациях следует использовать обработчик многократного использования и в каких ситуациях он не может быть повторно использован?

Последующие вопросы:

  • Что такое повторное использование?
  • Могу ли я поддерживать состояние (то есть переменные класса), когда Reusable = true??

Ответ 1

Это свойство указывает, может ли несколько запросов обрабатываться с тем же экземпляром IHttpHandler. По умолчанию в конце конвейера запросов все обработчики HTTP, помещенные в список обработчиков HandlerRecycleList для HttpApplication, имеют значение null. Если обработчик повторно используется, он не будет установлен в значение null, и экземпляр будет повторно использован в следующем запросе.

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

Я лично предлагаю оставить поведение по умолчанию (не повторно используемое), если вы используете только управляемые ресурсы, потому что сборщик мусора должен легко справиться с ними. Увеличение производительности от многоразовых обработчиков, как правило, незначительно по сравнению с риском для ввода трудно найти ошибки в потоке.

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

Ответ 2

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

Вот вопрос, который показывает, что происходит, когда он не используется должным образом:

Потоковые изображения с использованием HttpHandler

Ответ 3

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

ИЗМЕНИТЬ

Я не уверен, правильно ли мой ответ определяет, что такое повторное использование. Фактически это позволяет одновременное повторное использование, поэтому эффективное состояние лучше всего избегать или тщательно управлять поточно-безопасным способом.