//LeaderThread取工作->指派新的Leader->開始工作->回到idleQueue private int LeaderWork(object ThisThreadItem) { if (Controller.IsRunning && ((ThreadItem)ThisThreadItem).IsRunning) { //從WorkQueue取工作 WorkItem Work; if (WorkQueue.Count != 0) { lock (WorkQueueLock) Work = WorkQueue.Dequeue(); } else { return(0); } //從IdleThread Queue指派Thread成為新領導,沒有Thread就新增Thread或設為null lock (Controller.ThreadVariableChangeLock) if (IdleThreadQueue.Count != 0) { LeaderThread = IdleThreadQueue.Dequeue(); Debug.WriteLine("指派Thread[{0}]為新領導", LeaderThread._Thread.ManagedThreadId); LeaderThread._AutoResetEvent.Set(); } else { LeaderThread = Controller.CreateThread(new ParameterizedThreadStart(ThreadWork)); #if (LeaderThread != null) Debug.WriteLine("Thread[{0}] is Leader Create Done", LeaderThread._Thread.ManagedThreadId); #else Debug.WriteLine("沒有閒置的Thread"); #endif } //做從WorkQueue取出的工作 //如果工作的程式碼有Thread.CurrentThread.Abort,會把被Abort的Thread重置 try { switch (Work.GroupName) { case FunctionGroupName.TestFunctionGroup: TestWork.TestFunctionGroup(Work); break; case FunctionGroupName.FeaturesFunctionGroup: TestWork.FeaturesFunctionGroup(Work); break; } } catch { if (Thread.CurrentThread.ThreadState == ThreadState.AbortRequested || Thread.CurrentThread.ThreadState.ToString() == "Background, AbortRequested") { Debug.WriteLine("Thread[{0}] 被Abort,重置Thread[{0}]", Thread.CurrentThread.ManagedThreadId); Thread.ResetAbort(); } } //工作做完如果沒有LeaderThread會自動成為Leader,不然加入IdleThread Queue, lock (Controller.ThreadVariableChangeLock) if (LeaderThread == null) { Debug.WriteLine("Thread[{0}] 成為新領導", Thread.CurrentThread.ManagedThreadId); LeaderThread = ((ThreadItem)ThisThreadItem); } else { Debug.WriteLine("Thread[{0}] 進入閒置佇列", Thread.CurrentThread.ManagedThreadId); IdleThreadQueue.Enqueue((ThreadItem)ThisThreadItem); } } return(0); }