Beim Schreiben eines http-Handlers / Moduls muss ein Schnittstellenmitglied namens - bool IsReusable implementiert werden .
Welche Bedeutung hat dieses Mitglied? Wenn ich es auf false (oder true) setze, was bedeutet dies für den Rest der Web-App?
Beim Schreiben eines http-Handlers / Moduls muss ein Schnittstellenmitglied namens - bool IsReusable implementiert werden .
Welche Bedeutung hat dieses Mitglied? Wenn ich es auf false (oder true) setze, was bedeutet dies für den Rest der Web-App?
Antworten:
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.
Nach der Antwort von AnthonyWJones sollten Sie sicherstellen, dass Ihr HTTP-Handler vollständig threadsicher ist , wenn er true
fü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.
IsReusable
Erfordernis 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.
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.