gpt4 book ai didi

C# ReaderWriterLockSlim 避免递归的最佳实践

转载 作者:可可西里 更新时间:2023-11-01 07:43:20 26 4
gpt4 key购买 nike

我有一节课使用 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,因为当 GetFoo() 试图输入读锁。

我已经检查了 ReaderWriterLockSlim 的文档,我可以使用 LockRecursionPolicy.SupportsRecursion 来实现上述功能。但是,文档还建议不应将其用于任何新开发,而应仅在升级现有代码时使用。

鉴于此,在写入方法可以使用只读方法检索需要修改的内容的情况下,实现相同结果的最佳实践是什么?

最佳答案

您可以将类分为公开方法和私有(private)内部方法。内部方法执行诸如获取之类的逻辑,而公共(public)方法执行锁定。示例:

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];
}
}

关于C# ReaderWriterLockSlim 避免递归的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9904142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com