Я пишу, IHttpHandler
и мне нужно реализовать IsReusable
свойство. Когда я смотрю документацию MSDN, она говорит:
Получает значение, показывающее, может ли другой запрос использовать экземпляр IHttpHandler.
Это не очень помогает. В каких ситуациях следует использовать многоразовый обработчик, а в каких - нельзя?
Последующие вопросы:
- Что такое повторное использование?
- Могу ли я поддерживать состояние (т.е. переменные класса), когда
Reusable = true
??
c#
asp.net
asp.net-mvc
ihttphandler
system.web
Кис К. Баккер
источник
источник
Ответы:
Это свойство указывает, можно ли обрабатывать несколько запросов с помощью одного и того же экземпляра IHttpHandler. По умолчанию в конце конвейера запросов для всех обработчиков http, помещенных в handlerRecycleList HttpApplication, устанавливается значение null. Если обработчик можно использовать повторно, ему не будет присвоено значение null, и экземпляр будет повторно использован в следующем запросе.
Главный выигрыш - это производительность, потому что будет меньше объектов для сборки мусора.
Самая важная проблема для многоразового обработчика - то, что он должен быть потокобезопасным. Это нетривиально и требует определенных усилий.
Я лично предлагаю вам оставить значение по умолчанию (не использовать повторно), если вы используете только управляемые ресурсы, потому что сборщик мусора должен легко их обрабатывать. Прирост производительности от многократно используемых обработчиков обычно незначителен по сравнению с риском появления трудно обнаруживаемых ошибок потоковой передачи.
Если вы решили повторно использовать обработчик, вам следует избегать сохранения состояния в переменных класса, потому что, если к экземпляру обработчика обращаются одновременно, несколько запросов будут записывать / читать значения.
источник
IHttpHandler
s сIsReusable
установленным значениемtrue
и не имел никаких проблем. Главное, что нужно иметь в виду, - не иметь переменных, привязанных к классу, а использовать локальные переменные в ваших функциях.По-видимому, это сохраняет обработчик в памяти и может обрабатывать несколько запросов. Если установлено значение false, он должен создавать новый экземпляр обработчика для каждого входящего запроса.
Вот вопрос, который показывает, что происходит при неправильном использовании:
Потоковая передача изображений на основе данных с использованием HttpHandler
источник
Дешевле перерабатывать обработчик, чем обновлять каждый раз, когда приходит запрос, и сервер будет использовать меньше памяти, облегчая работу, которую должен выполнять GC. Если обработчик находится в состоянии, при котором обработка нового запроса не будет проблематичной
(т. Е. Любое состояние в экземпляре обработчика было сброшено), то его следует квалифицировать как повторно используемое.РЕДАКТИРОВАТЬ
Я не уверен, правильно ли мой ответ определяет, что такое повторное использование. Фактически это позволяет одновременное повторное использование, поэтому эффективного состояния лучше всего избегать или осторожно управлять поточно-ориентированным способом.
источник