public void StopWorking()
        {
            _IsWorking = false;

            foreach (Worker ActiveWorker in ListActiveWorker)
            {
                ActiveWorker.StopWorking();
            }
        }
        public void StartWorking()
        {
            foreach (Worker ActiveWorker in ListActiveWorker)
            {
                ActiveWorker.StartWorking();
            }

            SuperviseWorkersThread.Start();
        }
        private void WaitForWorkersToStopWorking()
        {
            bool HasWorkersStoppedWorking = true;

            do
            {
                foreach (Worker ActiveWorker in ListActiveWorker)
                {
                    if (!ActiveWorker.IsWorking())
                    {
                        HasWorkersStoppedWorking = false;
                    }
                }
            }while (!HasWorkersStoppedWorking);
        }
示例#4
0
        public async Task SimpleTest()
        {
            var        allWorkItems = new HashSet <IActiveWorkItem>();
            TextWriter writer       = TestContext.Out;
            var        activeWorker = new ActiveWorker(
                async(workItem, initialBlockerToken) =>
            {
                initialBlockerToken.Dispose();
                lock (allWorkItems)
                {
                    allWorkItems.Add(workItem);
                }

                // Simple expected processing schedule.
                // ~ - grace period
                // X - blocked period
                // - - delay
                //// ====================>t
                //// ~~---XX
                ////   ~~---XX
                ////          ~~---XX
                ////            ~~---XX
                //// ====================>t
                // Estimated speed is 2 task in 450ms
                await Task.Delay(150);

                using (workItem.EnterWorkBlocker())
                {
                    await Task.Delay(100);
                }
            },
                TimeSpan.FromMilliseconds(100));

            var delayMilliseconds = 5000;
            await activeWorker.AsyncUsing(
                async w => { await Task.Delay(delayMilliseconds); });

            var expectedAsymptotically = (int)Math.Round(
                (delayMilliseconds * 2) / 450.0,
                MidpointRounding.AwayFromZero);
            var maxDelta = 5;

            writer.WriteLine($"Total executed work items = {allWorkItems.Count}");
            writer.WriteLine($"Expected asymptotically = {expectedAsymptotically}");
            Math.Abs(allWorkItems.Count - expectedAsymptotically).Should().BeLessOrEqualTo(maxDelta);
        }
 private void SplitWorkload(Workload ActiveWorkload, Worker Owner)
 {
     while (ActiveWorkload.HasWorkToDo)
     {
         foreach (Worker ActiveWorker in ListActiveWorker)
         {
             if (ActiveWorker == Owner)
             {
                 continue;
             }
             else if (ActiveWorker.IsAlive())
             {
                 ActiveWorker.AddWork(ActiveWorkload.PullWork());
             }
         }
     }
 }
示例#6
0
 public void CancelActiveWorkerAsync()
 {
     ActiveWorker?.CancelAsync();
 }