应该在ReaderWriterLockSlim锁上调用Dispose()吗?

时间:2012-09-13 17:42:45

标签: c# multithreading

我工作的项目由商业分析工具进行分析。它将我们的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...;
            }
}

2 个答案:

答案 0 :(得分:3)

确实需要处理。

大多数ReaderWriterLockSlim用于保护静态资源,因此将是一个不需要处理的静态实例。

但在您的情况下(每个实例一个ReaderWriterLockSlim),您需要创建课程IDisposable,并处置ReaderWriterLockSlim

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

ConcurrentDictionary这样的框架类使用普通锁。

答案 1 :(得分: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(); 
   }

}