Pregunta

Estoy tratando de simplificar las cosas. Aquí está mi código:

    If Threading.Monitor.TryEnter(syncRoot) Then
        Try
            'do something
        Finally
            Threading.Monitor.Exit(syncRoot)
        End Try
    Else
        'do something else
    End If

Esto es incluso peor que el ReaderWriterLock en términos de ruido. Puedo usar C # o VB, por lo que las respuestas que se apliquen a cualquiera de ellas serán bienvenidas.

¿Fue útil?

Solución

¿Usar un delegado?

Por ejemplo

public bool TryEnter(object lockObject, Action work) 
{
    if (Monitor.TryEnter(lockObject)) 
    {
       try 
       {
          work();
       }
       finally 
       {
           Monitor.Exit(lockObject);
       }        
       return true;
     }

     return false;
}

Otros consejos

Esto es muy similar a su última publicación , y esperaría una respuesta similar. La única diferencia significativa es que puede devolver " null " de su método si el tiempo de espera falla, entonces el " Dispose () " no se llama, y ??puede verificar fácilmente el valor:

using(var token = GetLock(syncLock, timeout)) {
  if(token != null) { ... }
}

El único problema real es que no necesariamente desea agregar un método de extensión a "objeto" (o incluso " T donde T: class ") ...

Jon Skeet ha mirado esto en el pasado - vale la pena echar un vistazo .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top