9

我喜欢 C# 中的快捷方式lock(myLock){ /* do stuff */}。读/写锁是否有等价物?(特别是 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;
    }
4

1 回答 1

14

您不能覆盖lock关键字的行为。一种常见的技术是劫持using关键字。

  1. 使DoWithWriteLock退货成为IDisposable
  2. TryEnterWriteLock将调用保留在DoWithWriteLock方法中
  3. 返回一个实现的对象IDisposable。在该对象的Dispose方法中,调用ExitWriteLock.

最终结果:

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

// After
using (DoWithWriteLock(rwLock))
{
    Do1();
    Do2();
}
于 2010-12-06T18:16:58.733 回答