I like the shortcut in C# of 开发者_JAVA技巧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;
}
You can't override the behaviour of the lock
keyword. A common technique is to hijack the using
keyword.
- Make
DoWithWriteLock
return anIDisposable
- Keep the
TryEnterWriteLock
call inside theDoWithWriteLock
method - Return an object that implements
IDisposable
. In that object'sDispose
method, put the call toExitWriteLock
.
The end result:
// Before
DoWithWriteLock(rwLock,
delegate
{
Do1();
Do2()
} );
// After
using (DoWithWriteLock(rwLock))
{
Do1();
Do2();
}
精彩评论