Quando si scrive un gestore / modulo http, c'è un membro di interfaccia da implementare chiamato - bool IsReusable .
Qual è il significato di questo membro? Se lo imposto su false (o true), cosa significa questo per il resto dell'app Web?
Quando si scrive un gestore / modulo http, c'è un membro di interfaccia da implementare chiamato - bool IsReusable .
Qual è il significato di questo membro? Se lo imposto su false (o true), cosa significa questo per il resto dell'app Web?
Risposte:
Il normale punto di ingresso per un gestore è il metodo ProcessRequest. Tuttavia, potresti avere del codice nel costruttore della classe che mette insieme alcuni valori di istanza che sono costosi da costruire.
Se si specifica Riutilizzabile come vero, l'applicazione può memorizzare l'istanza nella cache e riutilizzarla in un'altra richiesta semplicemente chiamando il suo metodo ProcessRequest più e più volte, senza doverlo ricostruire ogni volta.
L'applicazione creerà un'istanza di tutti questi gestori necessari per gestire il carico corrente.
Il rovescio della medaglia è che se il numero di istanze necessarie è maggiore delle istanze attualmente presenti, causano l'utilizzo di più memoria. Al contrario, possono anche ridurre gli usi della memoria apparente poiché il loro valore di istanza sopravviverà ai cicli GC e non dovrà essere riassegnato frequentemente.
Un altro avvertimento è che devi essere sicuro che alla fine dell'esecuzione di ProcessRequest lo stato dell'oggetto sia come desideri che un'altra richiesta riutilizzi l'oggetto.
Oltre alla risposta di AnthonyWJones, se il tuo gestore HTTP ritorna true
per IsReusable
allora dovresti assicurarti che sia completamente sicuro per i thread.
Non c'è nulla nella documentazione che indichi che i gestori riutilizzabili non possono essere riutilizzati contemporaneamente, anche se le attuali implementazioni Microsoft sembrano riutilizzarle consecutivamente. Ma, almeno in teoria, una singola istanza del gestore potrebbe essere riutilizzata simultaneamente da più richieste, quindi non dovresti fare affidamento su dati che potrebbero essere modificati da altri thread simultanei.
IsReusable
richiedere la sicurezza dei thread sembra in contraddizione con la risposta di AnthonyWJones. Come capisco il suo terzo paragrafo (L'applicazione creerà un'istanza di molti di ...), un'istanza di gestore riutilizzabile non verrà riutilizzata contemporaneamente, ma solo dopo aver terminato la sua elaborazione corrente. Se questo è vero, non è necessario essere thread-safe.
Se non memorizzi alcuno stato in quell'istanza (cioè: non hai campi (aka "variabili di classe")), allora dovresti essere sicuro di riutilizzarlo.
Di default è falso essere al sicuro.