У меня есть класс, использующий 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
, чтобы все вышеперечисленное работало. Однако в документации также рекомендуется не использовать это для какой-либо новой разработки и использовать только при обновлении существующего кода.
Учитывая это, как лучше всего добиться того же результата, когда метод записи может использовать метод только для чтения для извлечения объекта, который необходимо изменить?