Qual é o uso de IHttpHandler.IsReusable?

104

Estou escrevendo um IHttpHandlere precisarei implementar uma IsReusablepropriedade. Quando eu olho para a documentação do MSDN, ela diz:

Obtém um valor que indica se outra solicitação pode usar a instância IHttpHandler.

Isso não é muito útil. Em quais situações devo usar um manipulador reutilizável e em quais situações ele não deve ser reutilizável?

Perguntas de acompanhamento:

  1. O que é reutilização?
  2. Posso manter o estado (isto é, variáveis ​​de classe) quando Reusable = true??
Kees C. Bakker
fonte
9
Dê uma olhada aqui: foreachbiscuit.wordpress.com/2007/11/01/…
Homam
"Reutilizar" significa lidar com mais de uma solicitação com uma instância específica do manipulador. Você pode armazenar qualquer coisa na Sessão - não será afetado quando a instância do manipulador for lançada.
IrishChieftain
@IrishChieftain É como o .Net mantém um pacote de HttpHandlers instanciados, escolhe um e apenas fornece um contexto?
Kees C. Bakker,
1
@IrishChieftain agora estou usando-o para um simples streamer de algumas informações de log. Mas estou tentando aprender quais são as implicações de entender quando e como usar IHttpHandlers. Eles são um recurso esquecido por muitos.
Kees C. Bakker,

Respostas:

93

Esta propriedade indica se várias solicitações podem ser processadas com a mesma instância de IHttpHandler. Por padrão, no final de um pipeline de solicitação, todos os manipuladores http colocados em handlerRecycleList do HttpApplication são definidos como nulos. Se um manipulador for reutilizável, ele não será definido como nulo e a instância será reutilizada na próxima solicitação.

O principal ganho é o desempenho porque haverá menos objetos para coleta de lixo.
O ponto mais importante para o manipulador reutilizável é que ele deve ser thread-safe. Isso não é trivial e requer algum esforço.

Pessoalmente, sugiro que você deixe o valor padrão (não reutilizável) se usar apenas recursos gerenciados, porque o Coletor de Lixo deve lidar com eles facilmente. O ganho de desempenho de manipuladores reutilizáveis ​​geralmente é insignificante em comparação com o risco de introduzir bugs de threading difíceis de localizar.

Se você decidir reutilizar o manipulador, deve evitar manter o estado nas variáveis ​​de classe porque, se a instância do manipulador for acessada simultaneamente, várias solicitações escreverão / lerão os valores.

Branislav Abadjimarinov
fonte
1
Sua última recomendação para evitar manter o estado em variáveis ​​de classe é um pouco confusa. Supondo que você defina IsReusable como false, então não haveria nenhuma possibilidade de outra solicitação (concorrente ou não) acessar a mesma instância desse HttpHandler e, portanto, manter o estado nas variáveis ​​de classe seria seguro?
Ben Amada
2
Certo. Reformulei a última recomendação, enfatizando que ela é aplicável apenas se o IHttpHandler for reutilizado. Obrigado pelo esclarecimento, Ben!
Branislav Abadjimarinov
7
Pelo que vale a pena, eu implementei muitos, muitos IHttpHandlers com IsReusabledefinido como truee não tive problemas. O principal a se manter em mente é não ter nenhuma variável com escopo para a classe, mas sim usar variáveis ​​locais em suas funções.
dana
6
Ótima explicação. Claro e direto ao ponto. Gostaria que os artigos do MSDN fossem tão concisos.
AlexVPerl
1
@Branislav - Se eu entendi sua resposta certa. Não é apenas possível que diferentes threads utilizem diferentes instâncias do manipulador simultaneamente, mas também é possível que diferentes threads executem a MESMA instância do manipulador simultaneamente.
Ian de
11

Aparentemente, isso mantém o manipulador na memória e capaz de lidar com várias solicitações. Quando definido como falso, ele deve criar uma nova instância do manipulador para cada solicitação de entrada.

Aqui está uma pergunta que mostra o que acontece quando não é usado corretamente:

Streaming de imagens baseadas em banco de dados usando HttpHandler

IrishChieftain
fonte
Você tem alguma documentação de apoio à sua resposta?
Kees C. Bakker,
4
Como você, não consegui encontrar nenhuma documentação satisfatória no MSDN, então tive que testar o carregamento de imagens de um banco de dados para uma página de um site de comércio eletrônico e, em seguida, observar o que aconteceu :)
IrishChieftain
5

É mais barato reciclar o manipulador do que usar um novo toda vez que uma solicitação chega e o servidor usa menos memória, facilitando o trabalho que o GC precisa realizar. Se o manipulador estiver em um estado em que lidar com uma nova solicitação não seja problemático (ou seja, qualquer estado na instância do manipulador foi redefinido) , ele deve ser qualificado como reutilizável.

EDITAR

Não tenho certeza se minha resposta define corretamente o que é reutilização. Na verdade, ele permite a reutilização simultânea, portanto, o estado eficaz seria melhor evitado ou gerenciado com cuidado de maneira segura para thread.

gastador
fonte
Eu também acho. Você está certo, a questão real (fundamental) é: 'o que é reutilização?'
Kees C. Bakker,