C# ReaderWriterLockSlim Рекомендации по предотвращению рекурсии

У меня есть класс, использующий ReaderWriterLockSlimс методом чтения и методом записи, который использует метод чтения для извлечения изменяемого элемента. Краткий пример:

class FooLocker
{
    ReaderWriterLockSlim locker = new ReaderWriterLockSlim();
    List fooList = new List();

    public void ChangeFoo(int index, string bar)
    {
        locker.EnterWriteLock();

        try
        {
            Foo foo = GetFoo(index);
            foo.Bar = bar;
        }
        finally
        {
            locker.ExitWriteLock();
        }
    }

    public Foo GetFoo(int index) 
    {
        locker.EnterReadLock(); //throws System.Threading.LockRecursionException

        try
        {
            return fooList[index];
        }
        finally
        {
            locker.ExitReadLock();
        }
    }

    //snipped code for adding instances etc.
}

Как и выше, этот код выдает LockRecursionExceptionпри вызове ChangeFoo(), поскольку блокировка записи уже удерживается, когда GetFoo()пытается ввести блокировку чтения.

Я проверил документацию для ReaderWriterLockSlimи могу использовать LockRecursionPolicy.SupportsRecursion, чтобы все вышеперечисленное работало. Однако в документации также рекомендуется не использовать это для какой-либо новой разработки и использовать только при обновлении существующего кода.

Учитывая это, как лучше всего добиться того же результата, когда метод записи может использовать метод только для чтения для извлечения объекта, который необходимо изменить?

15
задан Adam Rodger 28 March 2012 в 08:55
поделиться