Sagen Sie, wenn ich den folgenden Block für den C # -Code habe:
%Vor% Soll ich versuchen, Ausnahmen innerhalb des Blocks lock
abzufangen? (Meine Hauptsorge ist, dass die Ausnahme innerhalb der Sperre ausgelöst werden kann, die verhindert, dass die Sperre "entsperrt" wird.)
Eine lock-Anweisung der Form "lock (x) ...", wobei x ein Ausdruck eines Referenztyps ist, entspricht genau (C # 4.0):
%Vor%Es gibt mehr zu beachten als nur den Mutex freizugeben.
Eine Ausnahme, die mit lock
auftritt, gibt die Sperre frei, aber in welchem Zustand befindet sich das Programm jetzt? Ein Thread, der auf die Sperre wartet, wird jetzt aufwachen und wird sich vielleicht jetzt mit einem ungültigen Zustand befassen. Dies ist ein schwieriges Problem ohne ideale Lösung.
Das Beste ist, versuchen Sie, Ihre Sperren so klein wie möglich zu halten und Methoden aufzurufen, die nicht werfen. (Das ist die elepant in dem Raum ignorieren, das ist das Böse ThreadAbortException
...)
Für eine gute Diskussion dieser Fragen siehe Eric Lipperts Artikel: Sperren und Ausnahmen mischen sich nicht .