2

我从事的一个项目通过商业分析工具进行了分析。它将我们的 ReaderWriterLockSlim 实现标记为内存泄漏的潜在来源,因为我们没有调用 Dispose() 方法。

我从未见过在此锁上调用此方法:无论是在我处理过的代码中,还是在我从中学到的代码示例中。应该调用 Dispose() 吗?如果它在线程仍然需要它时被释放怎么办?这可能吗?

这是我们当前如何使用它的示例 - 没有 Dispose():

    Public Class Test 
    {

    private ReaderWriterLockSlim _lookupLock = new ReaderWriterLockSlim();

            public IDictionary<int, SomeObject> GetAll()
            {
                _lookupLock.EnterWriteLock();
                try
                {
                    if (X == null || X.Count == 0)
                    {
                        Do Something...;
                    }
                }
                finally
                {
                    _lookupLock.ExitWriteLock();
                }

                return Something...;
            }
}
4

2 回答 2

4

它确实需要处理。

aReaderWriterLockSlim主要用于保护静态资源,因此将是不需要处理的静态实例。

但是在您的情况下(ReaderWriterLockSlim每个实例一个),您需要创建您的 classIDisposable并处置ReaderWriterLockSlim.

或者也许更好的选择是使用普通锁(即监视器)来保护实例资源,而不是使用ReaderWriterLockSlim. 可能没有太大的性能差异,它使您的代码更简单,并且避免了您需要使您的类 IDisposable。

框架类如ConcurrentDictionary使用普通锁。

于 2012-09-13T18:03:31.207 回答
0

在您的班级中,尝试从 IDisposable 继承。以此类声明为例。

将您的声明更改为此,当然,添加现有代码的其余部分。

Public Class Test : IDisposable
{

}

我将如何声明它,示例如下。

public class WriteLock : IDisposable
{
   ReaderWriterLockSlim _rwlock;
   public WriteLock(ReaderWriterLockSlim rwlock ) 
   { 
      _rwlock = rwlock;
      _rwlock.EnterWriteLock(); 
   }
   public void Dispose()
   {
      _rwlock.ExitWriteLock(); 
   }
}
于 2012-09-13T17:47:40.130 回答