2011-04-06 14 views
12

Tengo una pregunta .. ¿Está bien si tengo algo como esto:oportunidad y pregunta bloqueo

try 
{ 
    lock(programLock) 
    { 
     //some stuff 1 
    } 
} 
catch(Exception ex) { //stuff 2 } 

soy curioso si "some stuff 1" provoca una excepción, hace programLock todavía permanece bloqueado?

Respuesta

15

No, el bloqueo se libera, el bloqueo es más o menos equivalente a esto:

try 
{ 
    Monitor.Enter(programLock); 
    // some stuff 1 
} 
finally 
{ 
    Monitor.Exit(programLock); 
} 

(es decir, si se produce una excepción, Monitor.Exit se llamará automáticamente al salir del ámbito de la instrucción de bloqueo)

2

No. dejando las llaves de bloqueo siempre se desbloqueará.

6

Lock() no es más que

try 
{ 
    Monitor.Enter(...); 
} 
finally 
{ 
    Monitor.Exit(....); 
} 

por lo que ya se encarga de ello.

4

De msdn documentation

"... bloqueo o SyncLock asegura que el monitor subyacente es liberado, incluso si el código protegida lanza una excepción ."

nota: Usted puede crear sus propios bloques de seguros de excepción para las acciones arbitrarias con using bloques, la versión de .NET de la RAII idioma.