Есть ли эквивалент оператора lock {} для ReaderWriterLockSlim? - PullRequest
9 голосов
/ 06 декабря 2010

Мне нравится ярлык на 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;
    }

1 Ответ

14 голосов
/ 06 декабря 2010

Вы не можете переопределить поведение ключевого слова lock. Распространенная техника - перехватить ключевое слово using.

  1. Сделать DoWithWriteLock вернуть IDisposable
  2. Держите вызов TryEnterWriteLock внутри метода DoWithWriteLock
  3. Возвращает объект, который реализует IDisposable. В методе Dispose этого объекта вызовите ExitWriteLock.

Конечный результат:

// Before
DoWithWriteLock(rwLock,
    delegate
    {
        Do1();
        Do2()
    } );

// After
using (DoWithWriteLock(rwLock))
{
    Do1();
    Do2();
}
...