コード例 #1
0
        //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);
        }