第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能
一. 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-RegisterWaitForSingleObject8 //{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 }總結
以上是生活随笔為你收集整理的第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可转债上市当天卖出还是过几天卖出?从以下
- 下一篇: 32命令模式(Command Patte