2010-12-06 10 views
9

Me gusta el acceso directo en C# de lock(myLock){ /* do stuff */}. ¿Hay un equivalente para los bloqueos de lectura/escritura? (Específicamente ReaderWriterLockSlim.) En este momento, utilizo el siguiente método personalizado, que creo que funciona, pero es un poco molesto porque tengo que pasar mi acción como una función anónima, y ​​preferiría usar un mecanismo de bloqueo estándar si es posible .¿Hay un equivalente de la instrucción lock {} para ReaderWriterLockSlim?

void bool DoWithWriteLock(ReaderWriterLockSlim RWLock, int TimeOut, Action Fn) 
    { 
     bool holdingLock = false; 
     try 
     { 
      if (RWLock.TryEnterWriteLock(TimeOut)) 
      { 
       holdingLock = true; 
       Fn(); 
      } 
     } 
     finally 
     { 
      if (holdingLock) 
      { 
       RWLock.ExitWriteLock(); 
      } 
     } 
     return holdingLock; 
    } 
+1

El intento * * declaración está en el lugar equivocado. Ponlo * después de * TryEnterWriteLock(). No más necesidad de una variable, un atajo no tiene sentido. –

Respuesta

14

No puede anular el comportamiento de la palabra clave lock. Una técnica común es secuestrar la palabra clave using.

  1. Hacer DoWithWriteLock devuelve un IDisposable
  2. Mantener la llamada TryEnterWriteLock dentro del DoWithWriteLock método
  3. devolver un objeto que implementa IDisposable. En el método Dispose de ese objeto, ingrese la llamada al ExitWriteLock.

El resultado final:

// Before 
DoWithWriteLock(rwLock, 
    delegate 
    { 
     Do1(); 
     Do2() 
    }); 

// After 
using (DoWithWriteLock(rwLock)) 
{ 
    Do1(); 
    Do2(); 
} 
+1

antes puede ser mucho mejor: 'DoWithWriteLock (rwlock,() => { Do1(); Do2() });' – Andrey

+0

Hola Tim. ¿Es cierto que esto sería más fácil en F #? – jonnii

+0

¿Hay una manera análoga de hacer esto para TryEnterWriteLock con un tiempo de espera? – Xodarap

Cuestiones relacionadas