我有一个使用ReaderWriterLockSlim的类,它有一个read方法和一个write方法,后者使用read方法检索要修改的元素。一个简单的例子是:
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
,因为当GetFoo()
尝试进入读锁时,写锁已经被持有。
我已经查看了ReaderWriterLockSlim
的文档,我可以使用LockRecursionPolicy.SupportsRecursion
来实现上面的功能。但是,文档还建议不要将其用于任何新的开发,只应在升级现有代码时使用。
鉴于此,在write方法可以使用只读方法检索需要修改的内容时,实现相同结果的最佳实践是什么?
发布于 2012-03-28 08:59:04
您可以将您的类划分为公开方法和私有内部方法。内部方法执行类似抓取的逻辑,而公共方法执行锁定。示例:
class FooLocker
{
ReaderWriterLockSlim locker = new ReaderWriterLockSlim();
List<Foo> fooList = new List<Foo>();
public void ChangeFoo(int index, string bar)
{
locker.EnterWriteLock();
try
{
Foo foo = UnsafeGetFoo(index);
foo.Bar = bar;
}
finally
{
locker.ExitWriteLock();
}
}
public Foo GetFoo(int index)
{
locker.EnterReadLock();
try
{
return UnsafeGetFoo(index);
}
finally
{
locker.ExitReadLock();
}
}
private Foo UnsafeGetFoo(int index)
{
return fooList[index];
}
}
https://stackoverflow.com/questions/9904142
复制相似问题