0

全部,

对我来说,使用 IDisposable 模式来控制 ReaderWriterLockSlim 锁似乎很自然,因为它允许在没有额外的 try/catch 块的情况下清理锁。我注意到 BCL 中没有任何东西可以处理这个常见的(ish)任务,所以我想知道我下面的代码是否真的很幼稚?我在 SO 上看到了一些与这个一般领域相关的其他问题,但没有什么能正面解决这个想法的适当性。

问题也不在于是否应该调用 ReaderWriterLockSlim 对象上的 Dispose() 方法,而只是包装器。

public class LockWrapper : IDisposable
{
    private readonly ReaderWriterLockSlim @lock;
    private readonly bool writeRequired;

    public LockWrapper(ReaderWriterLockSlim @lock, bool writeRequired)
    {
        this.@lock = @lock;
        this.writeRequired = writeRequired;

        if (writeRequired)
        {
            @lock.EnterWriteLock();
        }
        else
        {
            @lock.EnterReadLock();
        }
    }

    public void Dispose()
    {
        if (writeRequired && @lock.IsWriteLockHeld)
        {
            @lock.ExitWriteLock();
        }
        else if (@lock.IsReadLockHeld)
        {
            @lock.ExitReadLock();
        }
    }
}

用法:

var @lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
using(var lockWrapper = new LockWrapper(@lock, true))
{
    //do something
}
4

0 回答 0