我有一个使用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.
}
如上所述,当调用ChangeFoo()
时,由于在尝试进入读取锁定时已经持有写入锁定,因此此代码会抛出一个LockRecursionException
。
我已经检查了ReaderWriterLockSlim
的文档,并且可以使用LockRecursionPolicy.SupportsRecursion
来允许上述操作。然而,文档还建议在任何新开发中不要使用此方法,并且只应在升级现有代码时使用。
鉴于此,如何实现相同的结果才是最佳实践,其中写入方法可以使用只读方法来检索需要修改的内容?