BlockingCollection.Dispose实际上是做什么的?

10

BlockingCollection.Dispose方法实际上是做什么的?


我在处理阻塞集合(例如释放最后一次Take)时遇到了问题,直到我开始使用CancellationToken,参见https://dev59.com/Z2025IYBdhLWcg3w25yy#5759866。 - Aviko
3个回答

13

这使得内部的等待句柄可以被正确地处理和释放。

BlockingCollection<T> 在内部使用一对事件等待句柄,这些句柄又有关联的本地 HANDLE

具体而言,BlockingCollection<T>.Dispose() 释放这两个句柄回操作系统,最终(通过 SemaphoreSlim->ManualResetEvent)在两个本地 HANDLE 实例上调用本地的 CloseHandle 方法。


4
使用反射器快速查看可以发现以下内容...
protected virtual void Dispose(bool disposing)
{
    if (!this.m_isDisposed)
    {
        if (this.m_freeNodes != null)
        {
            this.m_freeNodes.Dispose();
        }
        this.m_occupiedNodes.Dispose();
        this.m_isDisposed = true;
    }
}

m_freeNodesprivate SemaphoreSlim m_freeNodes;,因此它会释放在内部使用的 SemaphoreSlim。


-9
释放当前 BlockingCollection<T> 类的所有资源。 (来源)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接