2016-06-16 45 views
0

Ich frage mich über eine ausfallsichere Möglichkeit, Monitor.TryEnter aufzurufen. Die Dokumentation zeigt es wie folgt aus:So rufen Sie Monitor.TryEnter auf

if (Monitor.TryEnter(lockObj)) { 
    try { 
     // The critical section. 
    } 
    finally { 
     // Ensure that the lock is released. 
     Monitor.Exit(lockObj); 
    } 
} 

Da dies die ‚offizielle‘ Weg, es zu nennen, zögere ich, etwas anderes zu tun. Aber ich mit diesem Code nicht sehr wohl fühlen: Angenommen, wir eine Threadabort wie diese:

if (Monitor.TryEnter(lockObj)) { 
    // *** ThreadAbortException happens exactly here 
    try { 
     [...] 
    } 
    finally { [...] } 
} 

Heißt das Verlass mich nicht mit einer Sperre, die nie freigegeben wird?

+0

Warum nicht stattdessen 'lock (lockObj) {...}' 'verwenden? Außerdem ist ThreadAbortException in der Regel kein Problem, da der Prozess/die Anwendungsdomäne sowieso abgerissen wird. –

+0

@Lasse: Sperre erlaubt mir nicht, etwas anderes zu tun, wenn das Schloss bereits vergeben ist. Die threadAbortException tritt nicht nur auf, wenn der Prozess abgebrochen wird, es gibt mehrere Möglichkeiten, einen Thread zu beenden. –

Antwort

2

Sie haben Recht. Daher ist die empfohlene Methode Monitor.TryEnter zu verwenden ist:

bool lockAcquired; 

try 
{ 
    Monitor.TryEnter(lockObj, ref lockAcquired); 

    if (lockAcquired) 
    { 
     DoSomething(); 
    } 
} 
finally 
{ 
    if (lockAcquired) 
    { 
     Monitor.Exit(lockObj); 
    } 
} 
+0

Danke! Ich nahm an, dass der Code für TryEnter (lock) der empfohlene Code war, aber jetzt sehe ich, dass das der bevorzugte Code für die nicht so bevorzugte Überladung war. –

0

es sein kann. Und Sie können die alle Monitor mit einem try finally Block (mit der booleschen Überladung) umhüllen.

Über Ihr Beispiel von ThreadAbortException, das ist ein besonderer. Wenn es von der CLR nach dem Entladen der App-Domain ausgelöst wird, sorgt die CLR dafür, dass Sie das tun, was sie benötigt, und danach wird kein Code in dieser App-Domain ausgeführt, sodass Sie sich keine Sorgen machen müssen.

Und wenn Sie es manuell zu werfen, in irgendeiner Art und Weise werden Sie in einem schlechten Zustand sein ...

Als Randnotiz here, um das Vertrauen der Programmierer in der Freigabe des Schlosses im Fall einen Blick der Ausnahme.