示例#1
0
        public void CanCancelOperation()
        {
            AutoResetEvent workerStarted    = new AutoResetEvent(false);
            AutoResetEvent workerExecuted   = new AutoResetEvent(false);
            AutoResetEvent workerCancelled  = new AutoResetEvent(false);
            AutoResetEvent allowTerminating = new AutoResetEvent(false);

            bool?cancelled = null;

            DoWorkEventHandler worker = delegate(object sender, DoWorkEventArgs e)
            {
                AsyncWorker genericWorker = (AsyncWorker)sender;
                genericWorker.WorkerSupportsCancellation = true;

                workerStarted.Set();
                while (!genericWorker.CancellationPending)
                {
                    Thread.Sleep(1);
                }

                e.Cancel = true;
                workerCancelled.Set();
                allowTerminating.WaitOne();
            };

            RunWorkerCompletedEventHandler completed = delegate(object sender, RunWorkerCompletedEventArgs e)
            {
                cancelled = e.Cancelled;
                workerExecuted.Set();
            };

            AsyncWorker testee = new AsyncWorker(worker, completed);

            testee.RunWorkerAsync();
            workerStarted.WaitOne(TimeOut).Should().BeTrue("worker should start.");

            testee.CancelAsync();
            workerCancelled.WaitOne(TimeOut).Should().BeTrue("worker should cancel.");

            allowTerminating.Set();
            workerExecuted.WaitOne(TimeOut).Should().BeTrue("worker should execute.");

            cancelled.Should().BeTrue("result should reflect canceled state.");
        }
示例#2
0
        public void CanCancelOperation()
        {
            AutoResetEvent workerStarted = new AutoResetEvent(false);
            AutoResetEvent workerExecuted = new AutoResetEvent(false);
            AutoResetEvent workerCancelled = new AutoResetEvent(false);
            AutoResetEvent allowTerminating = new AutoResetEvent(false);

            bool? cancelled = null;

            DoWorkEventHandler worker = delegate(object sender, DoWorkEventArgs e)
            {
                AsyncWorker genericWorker = (AsyncWorker)sender;
                genericWorker.WorkerSupportsCancellation = true;

                workerStarted.Set();
                while (!genericWorker.CancellationPending)
                {
                    Thread.Sleep(1);
                }

                e.Cancel = true;
                workerCancelled.Set();
                allowTerminating.WaitOne();
            };

            RunWorkerCompletedEventHandler completed = delegate(object sender, RunWorkerCompletedEventArgs e)
            {
                cancelled = e.Cancelled;
                workerExecuted.Set();
            };

            AsyncWorker testee = new AsyncWorker(worker, completed);

            testee.RunWorkerAsync();
            workerStarted.WaitOne(TimeOut).Should().BeTrue("worker should start.");

            testee.CancelAsync();
            workerCancelled.WaitOne(TimeOut).Should().BeTrue("worker should cancel.");

            allowTerminating.Set();
            workerExecuted.WaitOne(TimeOut).Should().BeTrue("worker should execute.");

            cancelled.Should().BeTrue("result should reflect canceled state.");
        }