Ich stelle fest, dass niemand in seinen Antworten auf diese alte Frage erwähnt hat, dass das Aufheben einer Sperre für eine Ausnahme eine unglaublich gefährliche Sache ist. Ja, Sperranweisungen in C # haben "endlich" Semantik. Wenn die Steuerung das Schloss normal oder abnormal verlässt, wird das Schloss freigegeben. Sie reden alle darüber, als wäre es eine gute Sache, aber es ist eine schlechte Sache! Wenn Sie einen gesperrten Bereich haben, der eine nicht behandelte Ausnahme auslöst, ist es richtig, den erkrankten Prozess unmittelbar vor der Zerstörung weiterer Benutzerdaten zu beenden , die Sperre nicht freizugeben und fortzufahren .
Betrachten Sie es so: Angenommen, Sie haben ein Badezimmer mit einem Schloss an der Tür und eine Reihe von Leuten, die draußen warten. Eine Bombe im Badezimmer geht hoch und tötet die Person dort. Ihre Frage lautet: "Wird in dieser Situation das Schloss automatisch entriegelt, damit die nächste Person ins Badezimmer gelangen kann?" Ja, es wird. Das ist keine gute Sache. Dort ist gerade eine Bombe hochgegangen und hat jemanden getötet! Die Wasserleitungen sind wahrscheinlich zerstört, das Haus ist nicht mehr baulich einwandfrei und es könnte eine weitere Bombe darin sein . Das Richtige ist , alle so schnell wie möglich rauszuholen und das ganze Haus abzureißen.
Ich meine, denken Sie darüber nach: Wenn Sie einen Codebereich gesperrt haben, um aus einer Datenstruktur zu lesen, ohne dass dieser in einem anderen Thread mutiert ist, und etwas in dieser Datenstruktur eine Ausnahme ausgelöst hat, stehen die Chancen gut, dass dies an der Datenstruktur liegt ist korrupt . Benutzerdaten sind jetzt durcheinander; Sie möchten zu diesem Zeitpunkt nicht versuchen, Benutzerdaten zu speichern , da Sie dann beschädigte Daten speichern. Beenden Sie einfach den Vorgang.
Wenn Sie einen Codebereich gesperrt haben, um eine Mutation durchzuführen, ohne dass ein anderer Thread gleichzeitig den Status liest, und die Mutation ausgelöst wird, ist dies jetzt sicher , wenn die Daten zuvor nicht beschädigt waren . Genau vor diesem Szenario soll das Schloss schützen . Jetzt erhält Code, der darauf wartet, diesen Status zu lesen, sofort Zugriff auf den beschädigten Status und stürzt wahrscheinlich selbst ab. Auch hier ist es richtig, den Prozess zu beenden.
Unabhängig davon, wie Sie es in Scheiben schneiden, ist eine Ausnahme innerhalb eines Schlosses eine schlechte Nachricht . Die richtige Frage lautet nicht: "Wird mein Schloss im Falle einer Ausnahme bereinigt?" Die richtige Frage lautet: "Wie stelle ich sicher, dass es innerhalb eines Schlosses keine Ausnahme gibt? Und wenn ja, wie strukturiere ich mein Programm so, dass Mutationen auf frühere gute Zustände zurückgesetzt werden?"