//Idle Time 60S 是參考以下網址 //https://doc.zeroc.com/pages/viewpage.action?pageId=16716652#Ice.ThreadPool.*-Ice.ThreadPool.name.ThreadIdleTime /// <summary> /// 初始化物件 /// </summary> /// <param name="MaxThread">最大Thread數量</param> /// <param name="MinThread">最小Thread數量</param> /// <param name="IdleTime">閒置時間,設置為0將不會自動減少Thread數量</param> public EasyThreadPool(int MaxThread, int MinThread = 5, int IdleTime = 60) { if (MaxThread < MinThread) { throw new ArgumentException("Parameter Can not be less than MinThread", "MaxThread"); } if (MinThread < 1) { throw new ArgumentException("Parameter Can not be less than 1", "MinThread"); } if (IdleTime < 0) { throw new ArgumentException("Parameter Can not be negative", "IdleTime"); } Controller = new ThreadpoolController(MaxThread, MinThread, IdleTime); IdleThreadQueue = Controller.GetIdleThreadQueue; LeaderThread = Controller.CreateThread(new ParameterizedThreadStart(ThreadWork)); Debug.WriteLine("Thread[{0}] is Leader Create Done", LeaderThread._Thread.ManagedThreadId); for (int i = 1; i < MinThread; i++) { ThreadItem threadItem = Controller.CreateThread(new ParameterizedThreadStart(ThreadWork)); IdleThreadQueue.Enqueue(threadItem); Debug.WriteLine("Thread[{0}] Create Done", threadItem._Thread.ManagedThreadId); } }
//產生Thread和一些設定 private ThreadItem NewThreadItem(ParameterizedThreadStart DoWork) { ThreadItem NewThreadItem = new ThreadItem() { _AutoResetEvent = new AutoResetEvent(false), IsRunning = true, _Thread = new Thread(DoWork) { IsBackground = true } }; AllThreadAutoWaitList.Add(NewThreadItem._AutoResetEvent); CurrentThreadQuantity++; return(NewThreadItem); }
protected virtual void Dispose(bool disposing) { if (disposed) { return; } Controller.Dispose(); if (disposing) { LeaderThread = null; IdleThreadQueue = null; WorkQueue = null; WorkQueueLock = null; } disposed = true; }
//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); }