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 に答える