//[Test] cancellation does not work yet public void Test_StartThread_CancelLater() { AutoResetEvent evt = new AutoResetEvent(false); DummyThreadBasedWorkItem item = new DummyThreadBasedWorkItem(evt); Assert.IsTrue(item.Start()); IWorkItemProgress progress = item.GetCurrentProgress(); Assert.AreEqual(Progress.Running, progress.Progress); Thread.Yield(); SpinWait spinWait = new SpinWait(); for (int i = 0; i < 10; i++) { spinWait.SpinOnce(); } item.Dispose(); for (int i = 0; i < 10; i++) { spinWait.SpinOnce(); } progress = item.GetCurrentProgress(); Thread.Sleep(1000 * 60); ///Assert.AreEqual(Progress.Failed, progress.Progress); }
public void Test_StartThread_CompleteFailed() { AutoResetEvent evt = new AutoResetEvent(false); DummyThreadBasedWorkItem item = new DummyThreadBasedWorkItem(evt) { FinishSucc = false, Message = "Job failed" }; Assert.IsTrue(item.Start()); IWorkItemProgress progress = item.GetCurrentProgress(); Assert.AreEqual(Progress.Running, progress.Progress); evt.Set(); Thread.Yield(); SpinWait spinWait = new SpinWait(); for (int i = 0; i < 30; i++) { progress = item.GetCurrentProgress(); if (progress.Progress == Progress.Failed) { break; } spinWait.SpinOnce(); } progress = item.GetCurrentProgress(); Assert.AreEqual(Progress.Failed, progress.Progress); Assert.AreEqual("Job failed", progress.Message); }
public void Test_StartThreadUntilFinish() { AutoResetEvent evt = new AutoResetEvent(false); DummyThreadBasedWorkItem item = new DummyThreadBasedWorkItem(evt); Assert.IsTrue(item.Start()); IWorkItemProgress progress = item.GetCurrentProgress(); Assert.AreEqual(Progress.Running, progress.Progress); evt.Set(); Thread.Yield(); SpinWait spinWait = new SpinWait(); for (int i = 0; i < 10; i++) { progress = item.GetCurrentProgress(); if (progress.Progress == Progress.Completed) { break; } spinWait.SpinOnce(); } progress = item.GetCurrentProgress(); Assert.AreEqual(Progress.Completed, progress.Progress); }
public void Refresh() { failedWorkItems = new List <IWorkItem>(); List <IWorkItem> completedWorkItems = new List <IWorkItem>(); StartPendingWorkItems(); foreach (IWorkItem runningWorkItem in runningWorkItems) { IWorkItemProgress progress = runningWorkItem.GetCurrentProgress(); switch (progress.Progress) { case Progress.Completed: completedWorkItems.Add(runningWorkItem); IWorkItem subsequentialWorkItem = runningWorkItem.GetNext(); if (subsequentialWorkItem != null) { AddWorkItem(runningWorkItem.GetNext()); } break; case Progress.Failed: case Progress.NotStarted: // not started will be considered as failed failedWorkItems.Add(runningWorkItem); break; case Progress.Running: break; } } runningWorkItems.RemoveAll(item => failedWorkItems.Contains(item) || completedWorkItems.Contains(item)); ProcessFinishedItems(completedWorkItems.Concat(failedWorkItems)); }
public void Test_FailedToStart() { AutoResetEvent evt = new AutoResetEvent(false); DummyThreadBasedWorkItem item = new DummyThreadBasedWorkItem(evt) { StartSucc = false, Message = "Start failed" }; Assert.IsFalse(item.Start()); IWorkItemProgress progress = item.GetCurrentProgress(); Assert.AreEqual(Progress.Failed, progress.Progress); Assert.AreEqual("Start failed", progress.Message); }
private void ProcessFinishedItems(IEnumerable <IWorkItem> finishedWorkItems) { foreach (IWorkItem workItem in finishedWorkItems) { IWorkItemProgress result = workItem.GetCurrentProgress(); if (result.Progress == Progress.Completed) { logger.LogWorkItemComplete(workItem); } else { logger.LogWorkItemFailed(workItem); } workItem.Dispose(); } logger.Flush(); }