public void Dispose()
{
if (_signal == null)
return;
BCLDebug.Assert(Thread.CurrentThread == _signal.Thread, "You called Dispose on the wrong thread, or reused your cancellation signal?");
List<CancellationSignal> signals = _signal.Thread.CancellationSignals;
bool tookLock = false;
RuntimeHelpers.PrepareConstrainedRegions();
try {
Monitor.ReliableEnter(signals, out tookLock);
CancellationSignal s = signals[signals.Count - 1];
signals.RemoveAt(signals.Count - 1);
if (!Object.ReferenceEquals(s, _signal))
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_CancellationRegionLeak"));
_signal.Thread = null;
_signal = null;
}
finally {
if (tookLock)
Monitor.Exit(signals);
Thread.EndThreadAffinity();
}
}