Bedeutung von bool IsReusable in der http-Handler-Schnittstelle

Antworten:

152

Der normale Einstiegspunkt für einen Handler ist die ProcessRequest-Methode. Möglicherweise enthält der Klassenkonstruktor jedoch Code, der einige Instanzwerte zusammenstellt, deren Erstellung teuer ist.

Wenn Sie Reusable als true angeben, kann die Anwendung die Instanz zwischenspeichern und in einer anderen Anforderung wiederverwenden, indem sie einfach ihre ProcessRequest-Methode immer wieder aufruft, ohne sie jedes Mal neu erstellen zu müssen.

Die Anwendung instanziiert so viele dieser Handler, wie für die aktuelle Last erforderlich sind.

Der Nachteil ist, dass wenn die Anzahl der benötigten Instanzen größer ist als die derzeit vorhandenen Instanzen, mehr Speicher verwendet wird. Umgekehrt können sie auch die scheinbare Speichernutzung reduzieren, da ihr Instanzwert GC-Zyklen überlebt und nicht häufig neu zugewiesen werden muss.

Eine weitere Einschränkung ist, dass Sie sicherstellen müssen, dass der Objektstatus am Ende der ProcessRequest-Ausführung so ist, wie Sie es für eine andere Anforderung zur Wiederverwendung des Objekts wünschen.

AnthonyWJones
quelle
2
Sie erwähnen die Wiederverwendung von Objekten als die Schlüsseloptimierung, die durch die Angabe von IsReusable = True erreicht wird. Wird IsReusable = False gesetzt, führt dies dazu, dass der Server niemals mehrere Instanzen des Handlers instanziiert. IE - eliminiert es gleichzeitige Anfragen?
Ian
@ Ian Ich glaube, es funktioniert dann wie eine normale Seite, wenn wiederverwendbar falsch ist, obwohl ich mich möglicherweise irre. Wenn es wiederverwendbar ist, kann es möglicherweise 6 gleichzeitige Anforderungen mit 2 oder 3 Instanzen verarbeiten (nur Beispiel), während es, wenn es nicht wiederverwendbar ist, 1: 1 Instanzen / Prozesse benötigt. Ich kann mir nicht vorstellen, dass .Net Anfragen stapeln lässt, wenn 1 Worker-Thread versucht, alles zu verarbeiten, während sein Status kontinuierlich aktualisiert / neu initialisiert wird.
DavidScherer
47

Nach der Antwort von AnthonyWJones sollten Sie sicherstellen, dass Ihr HTTP-Handler vollständig threadsicher ist , wenn er truefür zurückkehrt IsReusable.

Die Dokumentation enthält keine Hinweise darauf, dass wiederverwendbare Handler nicht gleichzeitig wiederverwendet werden können, obwohl die aktuellen Microsoft-Implementierungen sie nur nacheinander wiederzuverwenden scheinen. Zumindest theoretisch kann eine einzelne Handlerinstanz jedoch gleichzeitig von mehreren Anforderungen wiederverwendet werden, sodass Sie sich nicht auf Daten verlassen sollten, die möglicherweise von anderen gleichzeitigen Threads geändert werden.

LukeH
quelle
Tut mir leid, dass ich dick bin, aber könnte jemand bitte näher erläutern, was unter "Kontextwechsel" zu verstehen ist? Wenn Sie über die Sitzung oder die Abfragezeichenfolge (content.Request.QueryString) auf Dinge zugreifen, ist das wiederverwendbar oder nicht?
Zod
5
Kontextwechsel ist, wenn eine CPU die Verarbeitung in einem Thread beendet und die Verarbeitung in einem anderen Thread startet. IE die CPU wechselte ihren Kontext von einem Thread zu einem anderen. Dies geschieht ständig in PCs, es gab uns die Illusion von Multitasking, bevor es Multicore-Computer gab.
Larry Dukek
Ich konnte nicht verstehen, wann du gesagt hast, dass es jederzeit einen Kontextwechsel geben könnte . Wenn wir url eingeben und die Eingabetaste drücken, wird jeweils eine Anforderung ausgeführt. richtig ?
Die Kontextumschaltung ist ein Problem, wenn mehrere Benutzer gleichzeitig eine Anwendung verwenden. Wenn beispielsweise zwei Benutzer denselben Datensatz gleichzeitig aktualisieren möchten, kann der Kontextwechsel Probleme verursachen.
Ishmael Smyrnow
7
Diese Aussage über das IsReusableErfordernis der Thread-Sicherheit scheint im Widerspruch zur Antwort von AnthonyWJones zu stehen. Soweit ich den dritten Absatz verstehe (die Anwendung wird so viele von ... instanziieren), wird eine wiederverwendbare Handlerinstanz nicht gleichzeitig wiederverwendet, sondern erst, nachdem die aktuelle Verarbeitung abgeschlossen wurde. Wenn dies zutrifft, muss kein Thread sicher sein.
Frédéric
3

Wenn Sie in dieser Instanz keinen Status speichern (dh Sie haben keine Felder (auch als "Klassenvariablen" bezeichnet)), sollten Sie ihn sicher wiederverwenden.

Es ist standardmäßig falsch, auf der sicheren Seite zu sein.

Andrei Rînea
quelle