Unten ist mein Verständnis für IsReusable
Eigenschaft
Wenn der Handler statischen Inhalt zurückgibt. es ist sicher, den Wert auf wahr zu setzen. Wenn der Thread jedoch dynamischen Inhalt zurückgibt, um ihn threadsicher zu machen, sollte IsReusable
auf false gesetzt werden.
In diesem Fall kann der Kontextwechsel auftreten, der dazu führen kann, dass der Handler eine falsche Ausgabe gibt.
Verwirrungen
Kontextwechsel sagt - Das Umschalten von einem Thread zu einem anderen Thread wird als Switching bezeichnet. richtig?
Absatz 2 besagt, dass Kontextwechsel auftreten kann - ich denke, wenn Sie die Anfrage senden. Zu diesem Zeitpunkt wird nur ein Kontext erstellt, was zu einem Response
führt. Recht? Also, wie Context Switching möglich ist. Können Sie ein Beispiel geben?
Die Frage, was der Handler "zurückgibt" (besser gesagt: welcher Inhalt der Handler schreibt) hat nichts mit der Eigenschaft IsReusable
zu tun. Diese Eigenschaft gibt eine Aussage über die Thread-Sicherheit Ihres Codes und nicht darüber, ob sich der Inhalt ändern kann. Zum Beispiel wäre ein Handler, der DateTime.Now
schreibt, wiederverwendbar. Ein Handler, der ein SqlConnection
-Feld hat und unveränderliche Daten liest, wäre nicht wiederverwendbar, da die Verbindung nicht threadsicher ist, selbst wenn die gelesenen Daten immer gleich sind.
Context Switching hat auch nichts damit zu tun, weil auf einer Multi-Core-Box kein Context-Switch notwendig ist, um Parallelität zu verursachen. Was du meinst ist "Thread-Sicherheit" in Bezug auf gleichzeitige Aufrufe von ProcessRequest
für dieselbe Instanz deiner IHttpHandler
abgeleiteten Klasse.
Nun noch ein praktischer Tipp: Immer IsReusable
return false und sicherstellen, dass Ihre Handler-Klasse billig zuzuordnen ist und nicht viel Müll mit sich bringt. GC'ing ein einzelnes Objekt ist nichts ! Meine Vermutung ist, dass die IsReusable
-Eigenschaft erstellt wurde, um ASP.NET einen künstlichen Vorteil in Spielzeugbenchmarks zu geben oder schlecht entworfene Handler zu unterstützen, deren Erstellung teuer ist.
Wenn Sie teure Ressourcen (wie Caches) haben, speichern Sie sie woanders (vielleicht in einem statischen Feld).
Eine einfache Möglichkeit, Thread-Sicherheit zu erhalten, besteht darin, nichts zu teilen. In diesem Sinne, teile nicht den Handler.
TL; DR: Setzen Sie IsReusable
auf false und fahren Sie fort. Es gibt hier nichts zu sehen. Dies ist nur ein verwirrender Designfehler in ASP.NET.
Tags und Links asp.net-mvc asp.net-mvc-3 asp.net-mvc-4