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

标签 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...;
            }
}

最佳答案

它确实需要处理。

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

但在您的情况下(每个实例一个 ReaderWriterLockSlim),您需要将您的类设置为 IDisposable,并处置 ReaderWriterLockSlim

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

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

关于c# - 应该在 ReaderWriterLockSlim 锁上调用 Dispose() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12411879/

相关文章:

c# - 捕获鼠标移动并导出为图像 [code |应用程序]

ruby - 并发的,非阻塞的,固定大小的列表?

c# - WCF 最大消息大小配额

c# - 为什么没有处置契约(Contract)?

c - OpenMP 自定义调度

.net - .NET线程池和配置

c++ - future 的类型有可能转变吗?

java - 使用Java线程作为任务调度器,

c# - JSON C# Web 服务创建和测试?

c# - 当你有一个抽象类型的数组时,如何访问不在抽象类型上的派生类型成员