我有一个使用ReaderWriterLockSlim的类,该类具有读取方法和使用读取方法检索要修改的元素的写入方法。一个简单的例子是:
class FooLocker
{
ReaderWriterLockSlim locker = new ReaderWriterLockSlim();
List<Foo> fooList = new List<Foo>();
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
来允许上述工作。但是,文档还建议不要将其用于任何新开发,而应仅在升级现有代码时使用。
鉴于此,在写入方法可以使用只读方法检索需要修改的内容的情况下,实现相同结果的最佳实践是什么?