为了同步对我的属性的访问,我使用了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
来控制文档中所述的程序流。