Какая польза от IHttpHandler.IsReusable? - PullRequest
101 голосов
/ 31 марта 2011

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

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

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

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

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

Ответы [ 3 ]

93 голосов
/ 31 марта 2011

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

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

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

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

11 голосов
/ 31 марта 2011

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

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

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

5 голосов
/ 31 марта 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...