全て、
IDisposable パターンを使用して ReaderWriterLockSlim ロックを制御することは、私にとって非常に自然なことのように思えます。この一般的な (らしい) タスクを処理する BCL には何もないことに気付きました。以下のコードは本当にナイーブなのでしょうか? この一般的な領域に関連する 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
}