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); }
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()); } } } }
public void CancelActiveWorkerAsync() { ActiveWorker?.CancelAsync(); }