private int RestartableJobWorkerMethod(RestartableJobArgs args, CancellationToken token) { if (token.IsCancellationRequested) { return(0); } args.Counter++; TestContext.WriteLine("{0} starting.", args.Text); args.WorkStarted.Set(); if (token.IsCancellationRequested) { TestContext.WriteLine("{0} cancellation requested.", args.Text); return(0); } args.Counter++; TestContext.WriteLine("{0} waiting.", args.Text); args.BackgroundWaiter.WaitOne(); TestContext.WriteLine("{0} proceeding.", args.Text); args.Counter++; if (token.IsCancellationRequested) { TestContext.WriteLine("{0} cancellation requested.", args.Text); return(0); } args.Counter++; TestContext.WriteLine("{0} returning.", args.Text); return(int.Parse(args.Text)); }
public void RestartableJobTestMethod() { using (RestartableJob <RestartableJobArgs, int> job = new RestartableJob <RestartableJobArgs, int>()) { RestartableJobHandler handler = new RestartableJobHandler(); job.WorkerCanceled += handler.Job_WorkerCanceled; job.WorkerComplete += handler.Job_WorkerComplete; job.WorkerFault += handler.Job_WorkerFault; using (RestartableJobArgs argsA = new RestartableJobArgs("1")) { job.Start(RestartableJobWorkerMethod, argsA); while (!argsA.WorkStarted.WaitOne(10)) { Collection <EventParams> eventParams; if (handler.WaitOne(0, out eventParams)) { foreach (EventParams p in eventParams) { TestContext.WriteLine(p.ToString()); } Assert.Fail("Unexpected {0} event", eventParams.Last().EventName); } } using (RestartableJobArgs argsB = new RestartableJobArgs("2")) { job.Start(RestartableJobWorkerMethod, argsB); while (!argsB.WorkStarted.WaitOne(10)) { Collection <EventParams> eventParams; if (handler.WaitOne(0, out eventParams)) { foreach (EventParams p in eventParams) { TestContext.WriteLine(p.ToString()); } Assert.Fail("Unexpected {0} event", eventParams.Last().EventName); } } Assert.AreEqual(2, argsA.Counter); Assert.AreEqual(2, argsB.Counter); argsA.BackgroundWaiter.Set(); argsB.BackgroundWaiter.Set(); bool canceled = false, completed = false; int waitCount = 0; while (!canceled && !completed) { Collection <EventParams> eventParams; if (handler.WaitOne(1000, out eventParams)) { foreach (EventParams p in eventParams) { if (p.EventName == "WorkerCanceled") { if (ReferenceEquals((p.Args as WorkerEventArgs <RestartableJobArgs>).Arg, argsA) && !canceled) { canceled = true; continue; } } else if (p.EventName == "WorkerComplete" && ReferenceEquals((p.Args as WorkerEventArgs <RestartableJobArgs, int>).Arg, argsB) && !completed) { Assert.AreEqual(2, (p.Args as WorkerEventArgs <RestartableJobArgs, int>).Result); completed = true; continue; } TestContext.WriteLine(p.ToString()); Assert.Fail("Unexpected {0} event", eventParams.Last().EventName); } } if (waitCount == 5 && !(canceled && completed)) { Assert.Fail((canceled) ? "Did not get completed event." : ((completed) ? "Did not get canceled event." : "Did not get expected events.")); } } Assert.AreEqual(3, argsA.Counter); Assert.AreEqual(4, argsB.Counter); } } } }