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

105

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

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

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

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

  1. Что такое повторное использование?
  2. Могу ли я поддерживать состояние (т.е. переменные класса), когда Reusable = true??
Кис К. Баккер
источник
9
Посмотрите здесь: foreachbiscuit.wordpress.com/2007/11/01/…
Homam
«Повторное использование» означает обработку более одного запроса с помощью определенного экземпляра обработчика. Вы можете хранить что угодно в Session - это не повлияет, когда экземпляр обработчика будет выпущен.
IrishChieftain
@IrishChieftain Это похоже на то, что .Net хранит набор экземпляров HttpHandler, выбирает один и просто передает ему контекст?
Kees C. Bakker
1
@IrishChieftain прямо сейчас я использую его для простого стримера некоторой информации журнала. Но я пытаюсь понять, каковы последствия, чтобы понять, когда и как использовать IHttpHandlers. Многие о них забывают.
Kees C. Bakker

Ответы:

94

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

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

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

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

Бранислав Абаджимаринов
источник
1
Ваша последняя рекомендация избегать сохранения состояния в переменных класса немного сбивает с толку. Предполагая, что вы установили IsReusable в значение false, тогда не будет ли возможности другого запроса (параллельного или нет) доступа к тому же экземпляру этого HttpHandler, и, следовательно, сохранение состояния в переменных класса будет безопасным?
Бен Амада
2
Конечно. Я перефразировал последнюю рекомендацию, подчеркнув, что она применима только в случае повторного использования IHttpHandler. Спасибо за разъяснение, Бен!
Бранислав Абаджимаринов
7
Как бы то ни было, я реализовал много-много IHttpHandlers с IsReusableустановленным значением trueи не имел никаких проблем. Главное, что нужно иметь в виду, - не иметь переменных, привязанных к классу, а использовать локальные переменные в ваших функциях.
дана
6
Отличное объяснение. Ясно и по делу. Я бы хотел, чтобы статьи MSDN были такими краткими.
AlexVPerl
1
@Branislav - Если я правильно понимаю ваш ответ. Разные потоки не только могут использовать разные экземпляры обработчика одновременно, но также могут одновременно выполнять один и тот же экземпляр обработчика разными потоками?
Ян
11

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

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

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

Ирландский
источник
У вас есть документация, подтверждающая ваш ответ?
Kees C. Bakker
4
Как и вы, я не смог найти удовлетворительной документации на MSDN, поэтому мне пришлось протестировать загрузку изображений из базы данных на страницу сайта электронной коммерции, а затем понаблюдать за тем, что произошло :)
IrishChieftain
5

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

РЕДАКТИРОВАТЬ

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

расточитель
источник
Я тоже так думаю. Вы правы, актуальный (фундаментальный) вопрос: что такое повторное использование?
Кис К. Баккер,