{
if (disposing && !disposed) {
disposed = true;
+ Thread.MemoryBarrier ();
callbacks = null;
#if NET_4_5
internal void RemoveCallback (CancellationTokenRegistration reg)
{
+ // Ignore call if the source has been disposed
+ if (disposed)
+ return;
Action dummy;
- callbacks.TryRemove (reg, out dummy);
+ var cbs = callbacks;
+ if (cbs != null)
+ cbs.TryRemove (reg, out dummy);
}
}
}
Assert.IsFalse (unregister);
Assert.IsTrue (register);
}
+
+ [Test]
+ public void DisposeAfterRegistrationTest ()
+ {
+ var source = new CancellationTokenSource ();
+ bool ran = false;
+ var req = source.Token.Register (() => ran = true);
+ source.Dispose ();
+ req.Dispose ();
+ Assert.IsFalse (ran);
+ }
}
}