C# 是否应在ReaderWriterLockSlim锁上调用Dispose()?

C# 是否应在ReaderWriterLockSlim锁上调用Dispose()?,c#,multithreading,C#,Multithreading,我从事的一个项目是通过一个商业分析工具进行分析的。它将我们的ReaderWriterLockSlim实现标记为内存泄漏的潜在来源,因为我们没有调用Dispose()方法 我从未见过在这个锁上调用这个方法:无论是在我编写的代码中,还是在我学习的代码示例中。应该调用Dispose()吗?如果在线程仍然需要它的时候处理它呢?这可能吗 下面是我们当前如何使用它的示例-no Dispose(): 公共类测试 { 私有ReaderWriterLockSlim _lookupLock=new ReaderWr

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

我从未见过在这个锁上调用这个方法:无论是在我编写的代码中,还是在我学习的代码示例中。应该调用Dispose()吗?如果在线程仍然需要它的时候处理它呢?这可能吗

下面是我们当前如何使用它的示例-no Dispose():

公共类测试
{
私有ReaderWriterLockSlim _lookupLock=new ReaderWriterLockSlim();
公共IDictionary GetAll()
{
_lookupLock.EnterWriteLock();
尝试
{
如果(X==null | | X.Count==0)
{
做点什么。。。;
}
}
最后
{
_lookupLock.ExitWriteLock();
}
归还某物。。。;
}
}

在类中,尝试从IDisposable继承。以这个类声明为例

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

Public Class Test : IDisposable
{

}
我将如何声明它,下面的例子

public class WriteLock : IDisposable
{
   ReaderWriterLockSlim _rwlock;
   public WriteLock(ReaderWriterLockSlim rwlock ) 
   { 
      _rwlock = rwlock;
      _rwlock.EnterWriteLock(); 
   }
   public void Dispose()
   {
      _rwlock.ExitWriteLock(); 
   }
}

它确实需要处理

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

但是在您的情况下(每个实例一个
ReaderWriterLockSlim
),您需要使类
IDisposable
,并处理
ReaderWriterLockSlim

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


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

类声明是标准的:公共类Something{}。它的方法像我发布的那样使用锁。然后你需要添加:IDisposable,就像我展示的例子一样,你有一个私有方法而不是类。。显示类别声明请更新我的答案以显示类别。我还不想使用包装器类来管理它。只是想知道是否需要对锁调用Dispose(),所以请将代码更改为这样并进行测试。。。查看内存泄漏是否消失。公共类测试:IDisposables不应该
测试.Dispose()
只要转过身调用
\u lookupLock.Dispose()
?当然,它有一个Dispose()方法,所以工具会抱怨。您需要权衡的是实际调用Dispose()的成本。这是一个非常高的值,您必须确保所有使用RWL的线程都已退出。这可能很难实现。简单的方法是让垃圾收集器来处理,它永远不会出错。我用它来保护静态资源,每个类有一个锁实例(我更新了我的问题以反映这一点)。由于线程依赖于锁,因此释放锁是否存在任何风险?如果要保护静态资源,那么_lookupLock字段肯定需要是静态的,在这种情况下,不需要释放它。
public class WriteLock : IDisposable
{
   ReaderWriterLockSlim _rwlock;
   public WriteLock(ReaderWriterLockSlim rwlock ) 
   { 
      _rwlock = rwlock;
      _rwlock.EnterWriteLock(); 
   }
   public void Dispose()
   {
      _rwlock.ExitWriteLock(); 
   }
}