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