[C#] 執行緒 (ThreadPool)(二)
Introduction
這邊介紹 ThreadPool 類別,可以幫助有效的管理執行緒的資源,一昧的增加執行緒物件,若沒有有效的管理,
有時會變成程式的負擔。
其中 ThreadPool.QueueUserWorkItem 方法,可以幫使用者的工作排入執行緒的管佇列,由 ThreadPool 對其做
管理,分配執行此方法的執行緒個體。
下面是方法的原型:
public static bool QueueUserWorkItem(
    WaitCallback callBack
)
public static bool QueueUserWorkItem(
    WaitCallback callBack,
    Object state
)參數
- callBack
 - 型別:System.Threading..::.WaitCallback      
WaitCallback,表示要執行的方法。
 
- state
 - 型別:System..::.Object      
物件,含方法所需的資料。
 
Example
sample1
執行緒的分配,皆由 ThreadPool 類別決定,建立新執行緒去作業,還是配置已經回收的執行緒去作業。
using System.Threading;
namespace TestThreadPool {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("以下開始將工作排入執行緒管理工作佇列 !!");
            Console.WriteLine("***********************************************");
            for (int n1 = 0; n1 < 3; n1++) {
                //建立 WaitCallback 物件,並且指定回呼方法
                WaitCallback myWaitCallback = new WaitCallback(WorkA);
                //將 WaitCallback 排入排程
                ThreadPool.QueueUserWorkItem(myWaitCallback, n1 + 1);
                //使畫面慢慢輸出
                Thread.Sleep(1000);
            }
            Console.WriteLine("*********************************************");
            for (int n1 = 0; n1 < 3; n1++) {
                ThreadPool.QueueUserWorkItem(new WaitCallback(WorkB), n1 + 1);
                Thread.Sleep(1000);
            }
            Console.WriteLine("***********************************");
            for (int n1 = 0; n1 < 3; n1++) {
                ThreadPool.QueueUserWorkItem(new WaitCallback(WorkC), n1 + 1);
                Thread.Sleep(1000);
            }
            Console.ReadLine();
        }
        public static void WorkA(object o) {
            string Name;
            //取得執行緒的雜湊碼
            Name = "使用的執行緒編號 Thread ID# = " + Thread.CurrentThread.GetHashCode();
            Console.WriteLine
              ("這是第一組被排入佇列的第 {0} 個工作,{1}", o, Name);
            Console.WriteLine("此工作執行緒結束 !! ");
        }
        public static void WorkB(object o) {
            string Name;
            Name = "使用的執行緒編號 Thread ID# = " +
              Thread.CurrentThread.GetHashCode();
            Console.WriteLine
              ("這是第二組被排入佇列的第 {0} 個工作,{1}", o, Name);
            Console.WriteLine("此工作執行緒暫停 2 秒 !! ");
            Thread.Sleep(2000);
        }
        public static void WorkC(object o) {
            string Name;
            Name = "使用的執行緒編號 Thread ID# = " +
              Thread.CurrentThread.GetHashCode();
            Console.WriteLine
              ("這是第三組被排入佇列的第 {0} 個工作,{1}", o, Name);
            Console.WriteLine("此工作執行緒暫停 10 秒 !! ");
            Thread.Sleep(10000);
        }
    }
輸出結果
Refrence
- ThreadPool 類別
 - ThreadPool 成員
 - ThreadPool.QueueUserWorkItem 方法
 - 執行緒和執行緒處理
 - Managed 執行緒集區
 - 識丁筆記 使用 Thread Pool
 
三小俠 小弟獻醜,歡迎指教