0

全て、

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
}
4

0 に答える 0