Ejemplo n.º 1
0
        private void Balance()
        {
            BalancedThread[] array = this.balancedThreadList;
            if (array == null)
            {
                return;
            }
            Scheduler.Schedule(array[0].JobProcessor, this.threadBalancer, 500);
            ThreadLoad     threadLoad      = null;
            BalancedThread balancedThread  = null;
            BalancedThread balancedThread2 = null;

            for (int i = 0; i < array.Length; i++)
            {
                ThreadLoad mostBurden = array[i].MostBurden;
                if (mostBurden != null && array[i].TotalLoad >= 128 && (threadLoad == null || mostBurden.PreviousLoad < threadLoad.PreviousLoad))
                {
                    balancedThread = array[i];
                    threadLoad     = mostBurden;
                }
                else if (balancedThread2 == null || balancedThread2.TotalLoad > array[i].TotalLoad)
                {
                    balancedThread2 = array[i];
                }
            }
            if (balancedThread != null && balancedThread2 != null && balancedThread.TotalLoad >= balancedThread2.TotalLoad * 3)
            {
                balancedThread.Change(threadLoad, balancedThread2);
            }
        }
Ejemplo n.º 2
0
 public void Change(ThreadLoad threadLoad, BalancedThread newBalancedThread)
 {
     if (!this.jobProcessor.IsInThread())
     {
         this.jobProcessor.Enqueue(Job.Create <ThreadLoad, BalancedThread>(new Action <ThreadLoad, BalancedThread>(this.Change), threadLoad, newBalancedThread));
         return;
     }
     if (threadLoad.Parent != this)
     {
         return;
     }
     this.Remove(threadLoad);
     newBalancedThread.Add(threadLoad);
 }