Kontextwechsel in IsReusable-Eigenschaft

9

IsReusable-Eigenschaft

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?

    
SMC 01.07.2013, 14:13
quelle

1 Antwort

2

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.

    
usr 27.07.2013 12:59
quelle