为了同步对我的属性的访问,我使用了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方法检查是否已使用IsReadLockHeldIsWriteLockHeld属性和ReaderWriterLockSlim属性获取了锁定。这可以正常工作,并提高了我的代码的性能。

到目前为止,还不错,但是当我重新阅读有关IsReadLockHeldIsWriteLockHeld的文档时,我注意到Microsoft的备注表:



我的问题是:我为什么不应该为此目的使用IsReadLockHeld/IsWriteLockHeld?我的代码有什么问题吗?一切都按预期工作,并且比使用递归锁(LockRecursionPolicy.SupportsRecursion)快得多。

为了澄清这一点:这是一个最小的示例。我不想知道锁本身是否必要,或者可以通过其他方式删除或实现。我只想知道为什么不应该使用IsReadLockHeld / IsWriteLockHeld来控制文档说明的程序流。

最佳答案

经过进一步研究后,我在German Support Forum of the Microsoft Developer Network上发布了相同的问题,并与非常有用的主持人Marcel Roma进行了讨论。他能够与ReaderWriterLockSlim Joe Duffy的程序员联系,后者写了这个答案:



总结起来:可以使用IsReadLockHeldIsWriteLockHeld属性有条件地获取锁,一切都会正常进行,但是这是不好的编程风格,应该避免使用它。最好坚持使用递归或非递归锁。为了保持良好的编码风格,IsReadLockHeldIsWriteLockHeld仅应用于调试目的。

我要再次感谢Marcel Roma和Joe Duffy的宝贵帮助。

关于c# - Microsoft对ReaderWriterLockSlim.IsReadLockHeld/IsWriteLockHeld的评论及其后果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17047122/

10-11 15:36