A cosa serve IHttpHandler.IsReusable?


105

Sto scrivendo un IHttpHandlere avrò bisogno di implementare una IsReusableproprietà. Quando guardo la documentazione MSDN dice:

Ottiene un valore che indica se un'altra richiesta può utilizzare l'istanza IHttpHandler.

Questo non è molto utile. In quali situazioni dovrei utilizzare un gestore riutilizzabile e in quali situazioni non dovrebbe essere riutilizzabile?

Domande di follow-up:

  1. Cos'è il riutilizzo?
  2. Posso mantenere lo stato (cioè le variabili di classe) quando Reusable = true??

9
Dai
Homam

"Riutilizzo" significa gestire più di una richiesta con una particolare istanza del gestore. Puoi memorizzare qualsiasi cosa in Session: non sarà influenzato quando l'istanza del gestore viene rilasciata.
IrishChieftain

@IrishChieftain È come se .Net tenesse un sacco di HttpHandlers istanziati, ne scelga uno e gli dia un contesto?
Kees C. Bakker

1
@IrishChieftain in questo momento lo sto usando per un semplice streamer di alcune informazioni di registro. Ma sto cercando di imparare quali sono le implicazioni per capire quando e come usare IHttpHandlers. Sono una caratteristica dimenticata da molti.
Kees C. Bakker

Risposte:


94

Questa proprietà indica se è possibile elaborare più richieste con la stessa istanza IHttpHandler. Per impostazione predefinita, alla fine di una pipeline di richieste, tutti i gestori http inseriti in handlerRecycleList di HttpApplication sono impostati su null. Se un gestore è riutilizzabile, non verrà impostato su null e l'istanza verrà riutilizzata nella richiesta successiva.

Il vantaggio principale sono le prestazioni perché ci saranno meno oggetti da raccogliere in modo indesiderato.
Il punto dolente più importante per il gestore riutilizzabile è che deve essere thread-safe. Questo non è banale e richiede un certo sforzo.

Personalmente suggerisco di lasciare il valore predefinito (non riutilizzabile) se usate solo risorse gestite perché il Garbage Collector dovrebbe gestirle facilmente. Il guadagno di prestazioni da gestori riutilizzabili è solitamente trascurabile rispetto al rischio di introdurre bug di threading difficili da trovare.

Se decidi di riutilizzare il gestore, dovresti evitare di mantenere lo stato nelle variabili di classe perché se si accede all'istanza del gestore contemporaneamente più richieste scriveranno / leggeranno i valori.


1
La tua ultima raccomandazione per evitare di mantenere lo stato nelle variabili di classe è leggermente confusa. Supponendo che tu abbia impostato IsReusable su false, non ci sarebbe alcuna possibilità che un'altra richiesta (simultanea o meno) acceda alla stessa istanza di quell'HttpHandler, e quindi il mantenimento dello stato nelle variabili di classe sarebbe sicuro?
Ben Amada

2
Sicuro. Ho riformulato l'ultima raccomandazione sottolineando che è applicabile solo se IHttpHandler viene riutilizzato. Grazie per il chiarimento, Ben!
Branislav Abadjimarinov

7
Per quel che vale, ne ho implementati molti, molti IHttpHandlercon IsReusableset to truee non ho avuto problemi. La cosa principale da tenere a mente è non avere alcuna variabile con scope per la classe, ma piuttosto usare variabili locali nelle tue funzioni.
dana

6
Ottima spiegazione. Chiaro e al punto. Vorrei che gli articoli di MSDN fossero così concisi.
AlexVPerl

1
@Branislav - Se ho capito bene la tua risposta. Non solo è possibile che thread diversi utilizzino contemporaneamente istanze diverse del gestore, ma è anche possibile che thread diversi eseguano contemporaneamente l'istanza STESSA del gestore?
Ian

11

Apparentemente, questo mantiene il gestore in memoria e in grado di gestire più richieste. Quando è impostato su false, deve creare una nuova istanza del gestore per ogni richiesta in arrivo.

Ecco una domanda che mostra cosa succede quando non viene utilizzato correttamente:

Streaming di immagini basate su database tramite HttpHandler


Hai qualche documentazione a sostegno della tua risposta?
Kees C. Bakker

4
Come te, non sono riuscito a trovare una documentazione soddisfacente su MSDN, quindi ho dovuto testare il caricamento di immagini da un database a una pagina di un sito di e-commerce e poi osservare cosa è successo :)
IrishChieftain

5

È più economico riciclare il gestore rispetto a uno nuovo ogni volta che arriva una richiesta e il server consumerà meno memoria, facilitando il lavoro che GC deve eseguire. Se il gestore si trova in uno stato in cui la gestione di una nuova richiesta non sarebbe problematica (cioè qualsiasi stato nell'istanza del gestore è stato ripristinato) , allora dovrebbe qualificarsi come riutilizzabile.

MODIFICARE

Non sono sicuro che la mia risposta definisca correttamente cosa sia il riutilizzo. In realtà consente il riutilizzo simultaneo, quindi è meglio evitare lo stato in modo efficace o gestirlo con cura in modo thread-safe.


Lo penserei anch'io. Hai ragione, la vera domanda (fondamentale) è: "cos'è il riutilizzo?"
Kees C. Bakker
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.