2011-11-18 17 views
5

Estoy mirando el código que se ha creado y utiliza un TryEnter en una llamada a método y bloquea en otros. Entonces, así:¿Monitor.TryEnter y lock() funcionan juntos?

private readonly object xmppLock = new object(); 

void f1() 
{ 
    if (Monitor.TryEnter(xmppLock)) 
    { 
     try 
     { 
      // Do stuff 
     } 
     finally 
     { 
      Monitor.Exit(xmppLock); 
     } 
    } 
} 

void f2() 
{ 
    lock(xmppLock) 
    { 
     // Do stuff 
    } 
} 

¿Esto está bien?

Respuesta

2

bloqueo bloqueará hasta que el recurso está disponible

TryEnter no hará nada si ya está bloqueado.

Según sus necesidades, debe usar una u otra.

En su caso f2() siempre hará lo que haga, sin importar cuánto tiempo tome. f1() devolverá inmediatamente si hay contención de cerradura

+0

Esto no responde a la pregunta, que es si está bien ** mezclar ** 'lock' y' Monitor.TryEnter', con el mismo objeto. [Ver respuestas a esta pregunta similar] (https://stackoverflow.com/q/14377366/199364) – ToolmakerSteve

8

lock es simplemente azúcar de sintaxis para Monitor.Enter, entonces sí, funcionará bien.

The Visual Basic SyncLock and C# lock statements use Monitor.Enter to take the lock and Monitor.Exit to release it. The advantage of using the language statements is that everything in the lock or SyncLock block is included in a Try statement.

(Dicho esto, se considera la falta de forma para bloquear el público algo como un objeto Type.)

+0

Esto no responde ** TryEnter ** que el OP usa –

+0

Es obvio que adquirir un bloqueo usando 'TryEnter' en un lugar funcionará junto con adquirirlo usando 'Enter' en otro lugar, por lo que no vale la pena detenerse en él. – mquander

4

Si estas dos construcciones trabajarán juntos. La palabra clave C# lock es solo una envoltura delgada sobre los métodos Monitor.Enter y Monitor.TryEnter.

Nota: evitaría utilizar una instancia de Type como el valor para bloquear. Hacerlo es muy frágil, ya que hace que sea muy fácil que dos fragmentos de código completamente independientes se bloqueen inesperadamente en el mismo objeto. Esto puede conducir a puntos muertos.

+0

Gracias por el puntero con respecto a typeof(). Hice una pregunta diferente con respecto a esto ya que no entendía qué estaba haciendo, ya que no es mi código el que estoy editando y quería asegurarme de que sabía lo que estaba sucediendo. – Firedragon

Cuestiones relacionadas