为了同步对我的属性的访问,我使用了ReaderWriterLockSlim类。我使用以下代码以线程安全的方式访问我的属性。
public class SomeClass
{
public readonly ReaderWriterLockSlim SyncObj = new ReaderWriterLockSlim();
public string AProperty
{
get
{
if (SyncObj.IsReadLockHeld)
return ComplexGetterMethod();
SyncObj.EnterReadLock();
try
{
return ComplexGetterMethod();
}
finally
{
SyncObj.ExitReadLock();
}
}
set
{
if (SyncObj.IsWriteLockHeld)
ComplexSetterMethod(value);
else
{
SyncObj.EnterWriteLock();
ComplexSetterMethod(value);
SyncObj.ExitWriteLock();
}
}
}
// more properties here ...
private string ComplexGetterMethod()
{
// This method is not thread-safe and reads
// multiple values, calculates stuff, ect.
}
private void ComplexSetterMethod(string newValue)
{
// This method is not thread-safe and reads
// and writes multiple values.
}
}
// =====================================
public static SomeClass AClass = new SomeClass();
public void SomeMultiThreadFunction()
{
...
// access with locking from within the setter
AClass.AProperty = "new value";
...
// locking from outside of the class to increase performance
AClass.SyncObj.EnterWriteLock();
AClass.AProperty = "new value 2";
AClass.AnotherProperty = "...";
...
AClass.SyncObj.ExitWriteLock();
...
}
为了避免每次获得或设置多个属性时不必要的锁定,我发布了
ReaderWriterLockSlim
-Object并在每次要获取或设置一堆属性时从类外部对其进行锁定。为此,我的getter和setter方法检查是否已使用IsReadLockHeld
的IsWriteLockHeld
属性和ReaderWriterLockSlim
属性获取了锁定。这可以正常工作,并提高了我的代码的性能。到目前为止,还不错,但是当我重新阅读有关
IsReadLockHeld
和IsWriteLockHeld
的文档时,我注意到Microsoft的备注表:我的问题是:我为什么不应该为此目的使用
IsReadLockHeld/IsWriteLockHeld
?我的代码有什么问题吗?一切都按预期工作,并且比使用递归锁(LockRecursionPolicy.SupportsRecursion
)快得多。为了澄清这一点:这是一个最小的示例。我不想知道锁本身是否必要,或者可以通过其他方式删除或实现。我只想知道为什么不应该使用
IsReadLockHeld
/ IsWriteLockHeld
来控制文档说明的程序流。 最佳答案
经过进一步研究后,我在German Support Forum of the Microsoft Developer Network上发布了相同的问题,并与非常有用的主持人Marcel Roma进行了讨论。他能够与ReaderWriterLockSlim
Joe Duffy的程序员联系,后者写了这个答案:
总结起来:可以使用IsReadLockHeld
和IsWriteLockHeld
属性有条件地获取锁,一切都会正常进行,但是这是不好的编程风格,应该避免使用它。最好坚持使用递归或非递归锁。为了保持良好的编码风格,IsReadLockHeld
和IsWriteLockHeld
仅应用于调试目的。
我要再次感谢Marcel Roma和Joe Duffy的宝贵帮助。
关于c# - Microsoft对ReaderWriterLockSlim.IsReadLockHeld/IsWriteLockHeld的评论及其后果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17047122/