Is there an equivalent of the lock{} statement for ReaderWriterLockSlim?

.net, c#, locking, readerwriterlockslim

Solution

You can't override the behaviour of the `lock` keyword. A common technique is to hijack the `using` keyword.

- Make `DoWithWriteLock` return an `IDisposable`

- Keep the `TryEnterWriteLock` call inside the `DoWithWriteLock` method

- Return an object that implements `IDisposable`. In that object's `Dispose` method, put the call to `ExitWriteLock`.

The end result:

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

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

Problem

I like the shortcut in C# of `lock(myLock){ /* do stuff */}`. Is there an equivalent for read/write locks? (Specifically ReaderWriterLockSlim.) Right now, I use the following custom method, which I think works, but is kind of annoying because I have to pass in my action as an anonymous function, and I would prefer to use a standard locking mechanism if possible. ``` 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; } ```

Original source