Significato di bool IsReusable nell'interfaccia del gestore http


Risposte:


152

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.


2
Si menziona il riutilizzo degli oggetti come l'ottimizzazione della chiave ottenuta specificando IsReusable = True. Impostando IsReusable = Falso risultato nel server che non crea mai istanze multiple del gestore. IE: elimina le richieste simultanee?
Ian,

@Ian credo che funzioni come una pagina normale quando riutilizzabile è falso, anche se potrei sbagliarmi. Quando è riutilizzabile, potrebbe essere in grado di gestire 6 richieste simultanee con 2 o 3 istanze (solo esempio) mentre quando non è riutilizzabile avrebbe bisogno di istanze / processi 1: 1. Non riesco a immaginare .Net lascerebbe che le richieste si accumulassero mentre 1 thread di lavoro cercava di gestirlo tutto aggiornando / reinizializzando continuamente il suo stato.
DavidScherer,

47

Oltre alla risposta di AnthonyWJones, se il tuo gestore HTTP ritorna trueper IsReusableallora 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.


Ci scusiamo per essere spessi, ma qualcuno potrebbe per favore approfondire cosa si intende per "cambio di contesto". Se si accede a cose dalla sesson o dalla stringa di query (content.Request.QueryString) è riutilizzabile o no?
zod,

5
Il cambio di contesto avviene quando una CPU interrompe l'elaborazione su un thread e inizia l'elaborazione su un altro. Cioè la CPU ha cambiato il suo contesto da un thread all'altro. Questo succede costantemente nei PC, ci ha dato l'illusione del multitasking prima che esistessero i computer multicore.
Larry Dukek,

Non riuscivo a capire quando hai detto che poteva esserci un cambio di contesto in qualsiasi momento . Quando si digita url e si preme invio, viene eseguita una richiesta alla volta. giusto ?

Il cambio di contesto sarà un problema quando più utenti utilizzano un'applicazione contemporaneamente. Ad esempio, se due utenti desiderano aggiornare lo stesso record contemporaneamente, il cambio di contesto potrebbe causare problemi.
Ishmael Smyrnow,

7
Questa affermazione su come IsReusablerichiedere 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.
Frédéric,

3

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.