Какая польза для IHttpHandler.IsReusable?
Я пишу IHttpHandler
, и мне нужно реализовать свойство IsReusable
. Когда я смотрю документацию MSDN, он говорит:
Получает значение, указывающее, может ли другой запрос использовать Экземпляр IHttpHandler.
Это не очень полезно. В каких ситуациях следует использовать обработчик многократного использования и в каких ситуациях он не может быть повторно использован?
Последующие вопросы:
- Что такое повторное использование?
- Могу ли я поддерживать состояние (то есть переменные класса), когда
Reusable = true
??
Ответы
Ответ 1
Это свойство указывает, может ли несколько запросов обрабатываться с тем же экземпляром IHttpHandler. По умолчанию в конце конвейера запросов все обработчики HTTP, помещенные в список обработчиков HandlerRecycleList для HttpApplication, имеют значение null. Если обработчик повторно используется, он не будет установлен в значение null, и экземпляр будет повторно использован в следующем запросе.
Основной выигрыш - это производительность, потому что будет меньше объектов для сбора мусора.
Самая важная точка боли для обработчика многократного использования заключается в том, что она должна быть потокобезопасной. Это не тривиально и требует определенных усилий.
Я лично предлагаю оставить поведение по умолчанию (не повторно используемое), если вы используете только управляемые ресурсы, потому что сборщик мусора должен легко справиться с ними. Увеличение производительности от многоразовых обработчиков, как правило, незначительно по сравнению с риском для ввода трудно найти ошибки в потоке.
Если вы решите повторно использовать обработчик, вам следует избегать сохранения состояний в переменных класса, потому что, если к экземпляру обработчика обращаются одновременно, несколько запросов будут писать/читать значения.
Ответ 2
По-видимому, это удерживает обработчик в памяти и способно обрабатывать несколько запросов. Когда установлено значение false, он должен создать новый экземпляр обработчика для каждого входящего запроса.
Вот вопрос, который показывает, что происходит, когда он не используется должным образом:
Потоковые изображения с использованием HttpHandler
Ответ 3
Потребитель дешевле перерабатывать обработчик, а не новый, каждый раз, когда приходит запрос, и сервер будет меньше памяти, чтобы облегчить работу GC. Если обработчик находится в состоянии, когда обращение с новым запросом не будет проблематичным (т.е. любое состояние экземпляра обработчика было reset), тогда оно должно считаться повторно используемым.
ИЗМЕНИТЬ
Я не уверен, правильно ли мой ответ определяет, что такое повторное использование. Фактически это позволяет одновременное повторное использование, поэтому эффективное состояние лучше всего избегать или тщательно управлять поточно-безопасным способом.