public void Dispose_AllowsMultipleDisposes() { SimpleTimerHarness harness = new SimpleTimerHarness(); VersionedTimer <int> timer = new VersionedTimer <int>(123, harness.Callback); timer.Change(10, Timeout.Infinite, 0); Assert.IsTrue(harness.Wait(), "Timer did not fire."); timer.Dispose(); timer.Dispose(); }
public void SimpleParallel() { var harness = new ParallelTimerObserver(); var timers = new List <VersionedTimer <int> >(); int expectedParallelism; int dummy; ThreadPool.GetMinThreads(out expectedParallelism, out dummy); harness.SetExpectedParallelism(expectedParallelism); for (int i = 0; i < expectedParallelism; i++) { var timer = new VersionedTimer <int>(0, harness.Callback); timers.Add(timer); } try { foreach (var timer in timers) { timer.Change(50, Timeout.Infinite, 0); } Assert.IsTrue(harness.Wait(5000), "Timers failed to fire."); } finally { harness.EnsureReleased(); foreach (var timer in timers) { timer.Dispose(); } } }
public void DisposeNotify_Requires_WaitHandle() { SimpleTimerHarness harness = new SimpleTimerHarness(); VersionedTimer <int> timer = new VersionedTimer <int>(123, harness.Callback); Assert2.Throws <ArgumentNullException>(() => timer.Dispose(null)); }
public void VerifyDisposalNotify_Pending() { for (int i = 0; i < 100; i++) { VersionedTimer <int> timer; using (var disposeNotify = new AutoResetEvent(false)) using (var callbackCanContinue = new AutoResetEvent(false)) using (var callbackStarted = new AutoResetEvent(false)) { VersionedTimerCallback <int> callback = (int state, long version) => { callbackStarted.Set(); callbackCanContinue.WaitOne(10 * 1000); }; timer = new VersionedTimer <int>(123, callback); timer.Change(10, Timeout.Infinite, 0); Assert.IsTrue(callbackStarted.WaitOne(5 * 1000), "Timer did not fire."); timer.Dispose(disposeNotify); callbackCanContinue.Set(); Assert.IsTrue(disposeNotify.WaitOne(5 * 1000), "Timer disposal notification did not fire."); } } }
public void DisposeFromCallback() { for (int i = 0; i < 100; i++) { AutoResetEvent timerDone = new AutoResetEvent(false); VersionedTimer <int> timer = null; bool failed = false; VersionedTimerCallback <int> callback = (int state, long version) => { try { timer.Dispose(); timerDone.Set(); } catch { failed = true; throw; } }; timer = new VersionedTimer <int>(123, callback); timer.Change(10, Timeout.Infinite, 1); Assert.IsTrue(timerDone.WaitOne(5 * 1000), "Timer did not fire"); Assert.IsFalse(failed, "Timer crashed during callback."); } }
public void DisposeDuringCallbackFromUser() { for (int i = 0; i < 100; i++) { VersionedTimer <int> timer; using (var callbackCanContinue = new AutoResetEvent(false)) using (var callbackStarted = new AutoResetEvent(false)) { VersionedTimerCallback <int> callback = (int state, long version) => { callbackStarted.Set(); callbackCanContinue.WaitOne(10 * 1000); }; timer = new VersionedTimer <int>(0, callback); timer.Change(10, Timeout.Infinite, 1); Assert.IsTrue(callbackStarted.WaitOne(5 * 1000), "Timer never fired."); timer.Dispose(); callbackCanContinue.Set(); } } }
public void VerifyDisposalNotify_NonePending() { for (int i = 0; i < 100; i++) { VersionedTimer <int> timer; SimpleTimerHarness harness = new SimpleTimerHarness(); using (var disposeNotify = new AutoResetEvent(false)) { timer = new VersionedTimer <int>(123, harness.Callback); timer.Dispose(disposeNotify); Assert.IsTrue(disposeNotify.WaitOne(5 * 1000), "Timer disposal notification did not fire."); } } }
public void DisposeWhilePending() { SimpleTimerHarness harness = new SimpleTimerHarness(); for (int i = 0; i < 1000; i++) { VersionedTimer <int> timer; timer = new VersionedTimer <int>(123, harness.Callback); timer.Change(1000, Timeout.Infinite, 1); timer.Dispose(); } Thread.Sleep(1500); Assert.AreEqual(harness.Callbacks, 0); }
public void VerifyObjectDisposedException() { VersionedTimer <int> timer; SimpleTimerHarness harness = new SimpleTimerHarness(); timer = new VersionedTimer <int>(123, harness.Callback); try { timer.Change(10, Timeout.Infinite, 0); Assert.IsTrue(harness.Wait(), "Timer did not fire."); } finally { timer.Dispose(); } Assert2.Throws <ObjectDisposedException>(() => { timer.Change(100, 100, 1); }); }