Ausnahmen innerhalb des Sperrblocks

8

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.)

    
c00000fd 07.04.2013, 09:05
quelle

3 Antworten

20

Die Sperre wird aufgehoben, wenn die Ausnahme vom Sperrblock entfernt wird.

Das liegt daran, dass lock(){...} vom Compiler grob in:

übersetzt wird %Vor%     
alex 07.04.2013, 09:05
quelle
1

Eine lock-Anweisung der Form "lock (x) ...", wobei x ein Ausdruck eines Referenztyps ist, entspricht genau (C # 4.0):

%Vor%     
Dmitry Martovoi 07.04.2013 09:07
quelle
1

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 .

    
Matthew Watson 07.04.2013 09:32
quelle

Tags und Links