Ich schreibe eine IHttpHandler
und muss eine IsReusable
Eigenschaft 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:
- Was ist Wiederverwendung?
- Kann ich den Status (dh Klassenvariablen) beibehalten, wenn
Reusable = true
?
c#
asp.net
asp.net-mvc
ihttphandler
system.web
Kees C. Bakker
quelle
quelle
Antworten:
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.
quelle
IHttpHandler
s mitIsReusable
set to implementierttrue
und hatte keine Probleme. Das Wichtigste ist, dass Sie keine Variablen für die Klasse festlegen, sondern lokale Variablen in Ihren Funktionen verwenden.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
quelle
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.
quelle