Estou escrevendo um IHttpHandler
e precisarei implementar uma IsReusable
propriedade. 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:
- O que é reutilização?
- Posso manter o estado (isto é, variáveis de classe) quando
Reusable = true
??
c#
asp.net
asp.net-mvc
ihttphandler
system.web
Kees C. Bakker
fonte
fonte
Respostas:
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.
fonte
IHttpHandler
s comIsReusable
definido comotrue
e 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.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
fonte
É 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.
fonte