private void CheckDeadWorkers() { LinkedListNode <Worker> ActiveNode = ListDeadWorker.First; while (ActiveNode != null) { Worker ActiveWorker = ActiveNode.Value; LinkedListNode <Worker> NextNode = ActiveNode.Next; if (ActiveWorker.IsAlive()) { ListDeadWorker.Remove(ActiveWorker); if (ListActiveWorker.Count < MaxActiveWorkers) { ListActiveWorker.AddLast(ActiveWorker); } else { ListIdleWorker.AddLast(ActiveWorker); } } ActiveNode = NextNode; } }
private async void SuperviseWorkers() { _IsWorking = true; while (_IsWorking) { await Task.Delay(TimeSpan.FromSeconds(1)); LinkedListNode <Worker> ActiveNode = ListActiveWorker.First; while (ActiveNode != null) { Worker ActiveWorker = ActiveNode.Value; LinkedListNode <Worker> NextNode = ActiveNode.Next; if (!ActiveWorker.IsAlive()) { ListActiveWorker.Remove(ActiveWorker); ListDeadWorker.AddLast(ActiveWorker); if (ListIdleWorker.Count > 0) { ListActiveWorker.AddLast(ListIdleWorker.First.Value); ListIdleWorker.RemoveFirst(); } Workload ActiveWorkload = ActiveWorker.GetWorkload(); SplitWorkload(ActiveWorkload, null); } else if (!ActiveWorker.IsWorking() && !ActiveWorker.GetWorkload().HasWorkToDo) { ListActiveWorker.Remove(ActiveWorker); ListIdleWorker.AddLast(ActiveWorker); } else { Workload Overload = ActiveWorker.GetOverload(); if (Overload.HasWorkToDo) { SplitWorkload(Overload, ActiveWorker); } } ActiveNode = NextNode; } CheckDeadWorkers(); } WaitForWorkersToStopWorking(); }