Significado do bool IsReusable na interface do manipulador http
Ao escrever um manipulador / módulo http, há um membro da interface a ser implementado chamado - bool IsReusable .
Qual é o significado desse membro? Se eu configurá-lo como falso (ou verdadeiro), o que isso significa para o restante do aplicativo Web?
— GurdeepS
Uso do mundo real de IHttpHandler.IsReusable Propriedade
O ponto de entrada normal para um manipulador é o método ProcessRequest. No entanto, você pode ter um código no construtor da classe que reúne alguns valores de instância que são caros de serem construídos.
Se você especificar Reusável como verdadeiro, o aplicativo poderá armazenar em cache a instância e reutilizá-la em outra solicitação, simplesmente chamando seu método ProcessRequest repetidamente, sem precisar reconstruí-lo a cada vez.
O aplicativo instanciará quantos manipuladores forem necessários para lidar com a carga atual.
A desvantagem é que, se o número de instâncias necessárias for maior que as instâncias atualmente presentes, elas causam mais memória a ser usada. Por outro lado, eles também podem reduzir o uso aparente de memória, pois o valor da instância sobreviverá aos ciclos do GC e não precisam ser realocados com frequência.
Outra ressalva é que você precisa ter certeza de que, no final da execução do ProcessRequest, o estado do objeto está como você deseja que outra solicitação reutilize o objeto.
Você menciona a reutilização de objetos como a otimização de chave alcançada especificando IsReusable = True. A configuração IsReusable = resultado falso no servidor não instanciar várias instâncias do manipulador. IE - elimina solicitações simultâneas?
@Ian Acredito que funcione como uma página normal quando reutilizável for falso, embora eu possa estar errado. Quando é reutilizável, pode ser capaz de lidar com 6 solicitações simultâneas com 2 ou 3 instâncias (apenas exemplo), enquanto que quando não é reutilizável, seria necessário instâncias / processos 1: 1. Eu não posso imaginar .Net deixaria as solicitações se acumularem enquanto 1 thread de trabalho tentava lidar com tudo isso enquanto atualizava / reinicializava continuamente seu estado.
— DavidScherer 4/01/19
Na sequência da resposta das AnthonyWJones, se seus retornos HTTP manipulador truepara IsReusable, em seguida, você deve garantir que ele é thread-safe totalmente.
Não há nada na documentação que indique que manipuladores reutilizáveis ​​não podem ser reutilizados simultaneamente, embora as implementações atuais da Microsoft pareçam reutilizá-los consecutivamente. Mas, pelo menos em teoria, uma instância de manipulador único pode ser reutilizada simultaneamente por várias solicitações; portanto, você não deve confiar em nenhum dado que possa ser modificado por outros encadeamentos simultâneos.
Desculpe por ser grossa, mas alguém poderia por favor elaborar o que se entende por "mudança de contexto". Se você acessar itens da sequência de sessões ou consulta (content.Request.QueryString), isso é reutilizável ou não?
A alternância de contexto é quando uma CPU para de processar em um thread e inicia o processamento em outro. Ou seja, a CPU mudou seu contexto de um segmento para outro. Isso acontece constantemente em PCs, nos deu a ilusão de multitarefa antes de haver computadores com vários núcleos.
— Larry Dukek
Eu não conseguia entender quando você disse que poderia haver uma mudança de contexto a qualquer momento . Quando digitamos url e pressionamos enter, isso executa uma solicitação por vez. certo ?
A troca de contexto será um problema quando vários usuários estiverem usando um aplicativo ao mesmo tempo. Por exemplo, se dois usuários quiserem atualizar o mesmo registro ao mesmo tempo, a mudança de contexto poderá causar problemas.
— Ishmael Smyrnow
Esta afirmação sobre a IsReusableexigência de segurança do encadeamento parece estar em contradição com a resposta do AnthonyWJones. Pelo que entendi no terceiro parágrafo (O aplicativo instanciará tantos ...), uma instância de manipulador reutilizável não será reutilizada simultaneamente, mas somente após o término do processamento atual. Se isso for verdade, não há necessidade de ser seguro para threads.
Se você não armazenar nenhum estado nessa instância (por exemplo: você não possui nenhum campo (também conhecido como "variáveis ​​de classe")), deve reutilizá-lo com segurança.