全部,
对我来说,使用 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
}