Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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();
                }
            }
        }
Exemplo n.º 3
0
        public void DisposeNotify_Requires_WaitHandle()
        {
            SimpleTimerHarness   harness = new SimpleTimerHarness();
            VersionedTimer <int> timer   = new VersionedTimer <int>(123, harness.Callback);

            Assert2.Throws <ArgumentNullException>(() => timer.Dispose(null));
        }
Exemplo n.º 4
0
        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.");
                        }
            }
        }
Exemplo n.º 5
0
        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.");
            }
        }
Exemplo n.º 6
0
        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();
                    }
            }
        }
Exemplo n.º 7
0
        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.");
                }
            }
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
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);
            });
        }