Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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();
        }