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); } }
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); }