Was ist die Verwendung für IHttpHandler.IsReusable?

104

Ich schreibe eine IHttpHandlerund muss eine IsReusableEigenschaft implementieren . Wenn ich mir die MSDN-Dokumentation ansehe, heißt es:

Ruft einen Wert ab, der angibt, ob eine andere Anforderung die IHttpHandler-Instanz verwenden kann.

Das ist nicht sehr hilfreich. In welchen Situationen sollte ich einen wiederverwendbaren Handler verwenden und in welchen Situationen sollte er nicht wiederverwendbar sein?

Folgefragen:

  1. Was ist Wiederverwendung?
  2. Kann ich den Status (dh Klassenvariablen) beibehalten, wenn Reusable = true?
Kees C. Bakker
quelle
"Wiederverwendung" bedeutet, dass mehr als eine Anforderung mit einer bestimmten Instanz des Handlers verarbeitet wird. Sie können alles in der Sitzung speichern - es wird nicht beeinflusst, wenn die Instanz des Handlers freigegeben wird.
IrishChieftain
@IrishChieftain Es ist wie .Net hält eine Tüte instanziierter HttpHandler, wählt eine aus und füttert sie einfach mit einem Kontext?
Kees C. Bakker
1
@IrishChieftain Im Moment verwende ich es für einen einfachen Streamer einiger Protokollinformationen. Aber ich versuche zu lernen, welche Auswirkungen es hat, zu verstehen, wann und wie IHttpHandler verwendet werden. Sie werden von vielen vergessen.
Kees C. Bakker

Antworten:

93

Diese Eigenschaft gibt an, ob mehrere Anforderungen mit derselben IHttpHandler-Instanz verarbeitet werden können. Standardmäßig werden am Ende einer Anforderungspipeline alle http-Handler, die in der handlerRecycleList der HttpApplication platziert sind, auf null gesetzt. Wenn ein Handler wiederverwendbar ist, wird er nicht auf null gesetzt und die Instanz wird bei der nächsten Anforderung wiederverwendet.

Der Hauptgewinn ist die Leistung, da weniger Objekte zum Sammeln von Müll benötigt werden.
Der wichtigste Schmerzpunkt für wiederverwendbare Handler ist, dass sie threadsicher sein müssen. Dies ist nicht trivial und erfordert einige Anstrengungen.

Ich persönlich schlage vor, dass Sie den Standardwert (nicht wiederverwendbar) beibehalten, wenn Sie nur verwaltete Ressourcen verwenden, da der Garbage Collector diese problemlos verarbeiten sollte. Der Leistungsgewinn durch wiederverwendbare Handler ist im Vergleich zum Risiko der Einführung schwer zu findender Threading-Fehler normalerweise vernachlässigbar.

Wenn Sie den Handler wiederverwenden möchten, sollten Sie vermeiden, den Status in Klassenvariablen beizubehalten, da bei gleichzeitigem Zugriff auf die Handlerinstanz mehrere Anforderungen die Werte schreiben / lesen.

Branislav Abadjimarinov
quelle
1
Ihre letzte Empfehlung, den Status in Klassenvariablen nicht beizubehalten, ist etwas verwirrend. Angenommen, Sie setzen IsReusable auf false, gibt es dann keine Möglichkeit, dass eine andere Anforderung (gleichzeitig oder nicht) auf dieselbe Instanz dieses HttpHandlers zugreift, und daher wäre es sicher, den Status in Klassenvariablen beizubehalten?
Ben Amada
2
Sicher. Ich habe die letzte Empfehlung umformuliert und betont, dass sie nur anwendbar ist, wenn der IHttpHandler wiederverwendet wird. Danke für die Klarstellung, Ben!
Branislav Abadjimarinov
7
Für das, was es wert ist, habe ich viele, viele IHttpHandlers mit IsReusableset to implementiert trueund hatte keine Probleme. Das Wichtigste ist, dass Sie keine Variablen für die Klasse festlegen, sondern lokale Variablen in Ihren Funktionen verwenden.
Dana
6
Tolle Erklärung. Klar und auf den Punkt. Ich wünschte, MSDN-Artikel wären so kurz.
AlexVPerl
1
@Branislav - Wenn ich deine Antwort richtig verstehe. Ist es nicht nur möglich, dass verschiedene Threads gleichzeitig verschiedene Instanzen des Handlers verwenden, sondern auch, dass verschiedene Threads die gleiche Instanz des Handlers gleichzeitig ausführen?
Ian
11

Anscheinend hält dies den Handler im Speicher und kann mehrere Anforderungen verarbeiten. Bei false muss für jede eingehende Anforderung eine neue Instanz des Handlers erstellt werden.

Hier ist eine Frage, die zeigt, was passiert, wenn es nicht richtig verwendet wird:

Streaming von Datenbankbildern mit HttpHandler

Irischer Häuptling
quelle
Haben Sie Unterlagen, die Ihre Antwort belegen?
Kees C. Bakker
4
Wie Sie konnte ich keine zufriedenstellende Dokumentation auf MSDN finden, also musste ich das Laden von Bildern aus einer Datenbank auf eine Seite einer E-Commerce-Site
testen
5

Es ist billiger, den Handler zu recyceln, als jedes Mal, wenn eine Anfrage eingeht, einen neuen zu installieren, und der Server verbraucht weniger Speicher, was die Arbeit erleichtert, die GC ausführen muss. Befindet sich der Handler in einem Zustand, in dem die Bearbeitung einer neuen Anforderung nicht problematisch wäre (dh ein Zustand in der Handlerinstanz wurde zurückgesetzt) , sollte er als wiederverwendbar gelten.

BEARBEITEN

Ich bin mir nicht sicher, ob meine Antwort richtig definiert, was Wiederverwendung ist. Es ermöglicht tatsächlich die gleichzeitige Wiederverwendung, sodass ein effektiver Zustand am besten vermieden oder auf threadsichere Weise sorgfältig verwaltet werden kann.

Spender
quelle
Das würde ich auch denken. Sie haben Recht, die eigentliche (grundlegende) Frage lautet: "Was ist Wiederverwendung?"
Kees C. Bakker