//[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();
        }