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."); }
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."); }