/// <summary> /// Delay dispose until belate handle is disposed. /// </summary> /// <returns></returns> /// <exception cref="ObjectDisposedException">Thrown if object has already been disposed.</exception> public IDisposable BelateDispose() { // Create handle StreamDisposeListDecoration handle = new StreamDisposeListDecoration(this); lock (m_disposelist_lock) { // Dispose has already been started if (IsDisposing) { throw new ObjectDisposedException(GetType().FullName); } // Add counter belateHandleCount++; } // Return handle return(handle); }
public void Dispose() { // Only one thread can dispose StreamDisposeListDecoration _parent = Interlocked.CompareExchange(ref parent, null, parent); // Handle has already been disposed if (_parent == null) { return; } // Should dispose be started bool processDispose = false; // Decrement handle count lock (_parent.m_disposelist_lock) { int newCount = --_parent.belateHandleCount; // Is not the handle. if (newCount > 0) { return; } // Check Dispose() has been called when counter goes to 0 processDispose = Interlocked.Read(ref _parent.disposing) == 1L; } // Start dispose if (processDispose) { if (_parent.nonDisposable) { _parent.ProcessNonDispose(); } else { _parent.ProcessDispose(); } } }
public BelateHandle(StreamDisposeListDecoration parent) { this.parent = parent; }