第三節: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-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         }
View Code

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM