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