10

What does BlockingCollection.Dispose actually do?

Jonathan Allen
  • 68,373
  • 70
  • 259
  • 447
  • I encountered issues with disposing blocking collection (e.g. release the Take last time), until I started to use CancellationToken, see https://stackoverflow.com/a/5759866/1544054 – Aviko Mar 10 '18 at 09:51

3 Answers3

13

This allows the internal wait handles to be disposed of properly.

BlockingCollection<T>, internally, uses a pair of event wait handles, which in turn have an associated native HANDLE.

Specifically, BlockingCollection<T>.Dispose() releases these two handles back to the operating system, by eventually (through SemaphoreSlim->ManualResetEvent) calling the native CloseHandle method on the two native HANDLE instances.

Reed Copsey
  • 554,122
  • 78
  • 1,158
  • 1,373
4

Having a quick look with reflector reveals this...

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;
    }
}

and m_freeNodes is private SemaphoreSlim m_freeNodes; so it releases the SemaphoreSlim that are used internally.

Andy Robinson
  • 7,309
  • 2
  • 30
  • 20
-9

Releases all resources used by the current instance of the BlockingCollection<T> class. (Source)

yfeldblum
  • 65,165
  • 12
  • 129
  • 169