一. ThreadPool簡介
ThreadPool簡介:ThreadPool是一個線程池,當你需要開啟n個線程時候,只需把這個指令拋給線程池,它將自動分配線程進行處理,它誕生於.Net 2.0時代。
ThreadPool與Thread的區別:
①:Thread每開啟一個異步任務,就需要使用一個Thread,具有專一性,即使Thread已經死掉,仍然需要占用資源。
②:ThreadPool能實現n個線程處理n+m個異步任務,且沒有死線程,默認都是初始化的。
二. 深究ThreadPool類
1:QueueUserWorkItem方法,將方法排入隊列以便開啟異步線程,它有兩個重載。
a:QueueUserWorkItem(WaitCallback callBack),WaitCallback是一個有一個object類型參數且無返回值的委托
b:QueueUserWorkItem(WaitCallback callBack, object state),WaitCallback是一個有一個object類型參數且無返回值的委托,state即WaitCallback中需要的參數, 不推薦這么使用,存在拆箱裝箱的轉換問題,影響性能。
使用方式:
a:嚴格的卡定義的寫法,第一個重載和第二個重載均是處理有一個參數的函數,大於一個參數需要封裝一個實體類,所需參數在實體類的構造函數中引入,然后調用第一個重載即可.
(不推薦這種寫法)
通用寫法: (可以處理任何參數個數的方法),這里不使用n即可。
ThreadPool.QueueUserWorkItem((n) =>
{
TestThread2(i.ToString(),i.ToString());
});
通用寫法的簡化版:
ThreadPool.QueueUserWorkItem(n => TestThread2(i.ToString(), i.ToString()));
代碼如下:
2:線程等待(有局限性的)
利用ManualResetEvent類和WaitOne方法,多個線程的話需要寫for循環。
運行結果:
3:常用方法
a:設置工作線程和IO線程的最大和最小值,SetMaxThreads和SetMinThreads。
b:獲取工作線程和IO線程最大、最小、可用值,GetMaxThreads、GetMinThreads、GetAvailableThreads。
測試結果:
三. 擴展一個定時器功能
1:RegisterWaitForSingleObject類,但是不常用.(涉及到定時任務,建議使用Quartz.Net)
2:System.threading命名空間下的Thread類,通過查看源碼,構造函數中有四個參數,第一個是object參數的委托,第二個是委托需要的值,
第三個是調用 callback 之前延遲的時間量(以毫秒為單位)
第四個是 調用 callback 的時間間隔(以毫秒為單位)

1 private void button12_Click(object sender, EventArgs e) 2 { 3 Stopwatch watch = new Stopwatch(); 4 watch.Start(); 5 Console.WriteLine("----------------- button_Click 開始 主線程id為:{0} --------------------------", Thread.CurrentThread.ManagedThreadId); 6 7 #region 01-RegisterWaitForSingleObject 8 //{ 9 // //每隔3s開啟一個線程執行業務邏輯 10 // ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(true), new WaitOrTimerCallback((obj, b) => 11 // { 12 // //做邏輯判斷,編寫業務邏輯 13 // Console.WriteLine("obj={0},tid={1}, datetime={2}", obj, Thread.CurrentThread.ManagedThreadId, DateTime.Now); 14 15 // }), "hello world", 3000, false); 16 //} 17 #endregion 18 19 #region 02-Timer類 20 { 21 //2秒后開啟該線程,然后每隔4s調用一次 22 System.Threading.Timer timer = new System.Threading.Timer((n) => 23 { 24 //書寫業務邏輯 25 Console.WriteLine("我是子線程中的業務邏輯哦"); 26 }, "1", 2000, 4000); 27 } 28 #endregion 29 30 31 watch.Stop(); 32 Console.WriteLine("----------------- button_Click 結束 主線程id為:{0} 總耗時:{1}--------------------------", Thread.CurrentThread.ManagedThreadId, watch.ElapsedMilliseconds); 33 34 }