C#異步編程的實現方式(3)——ThreadPool線程池


在需要創建的線程很多,且都是比較小的線程的情況下,可以使用線程池(ThreadPool類)。ThreadPool是一個靜態方法,提供了對一個線程集合的操作,它會在線程數不足時增加線程,空閑線程數過多時釋放資源。

 

1、ThreadPool簡單應用

調用ThreadPool.QueueUserWorkItem()方法,傳遞一個WaitCallBack委托類型的方法,並把這個方分配給線程池中的線程。線程池是自動運行的,如果線程池還沒有運行,就會創建一個線程池,並啟動第一個線程。如果線程池己經在運行,且有一個空閑線程來完成該任務,就把該作業傳遞給這個線程。

下面這個方法是一個符合WaitCallBack委托的方法:

   1: static void WaitCallBackMethod(object param)
   2: {
   3:     for (int i = 0; i < 5; i++)
   4:     {
   5:         Console.WriteLine(String.Format("Thread {0} is running", param));
   6:         Thread.Sleep(1000);
   7:     }
   8: }

然后在主線程里給線程池添加方法:

   1: static void Main(string[] args)
   2: {
   3:     for (int i = 1; i <= 3; i++)
   4:     {
   5:         ThreadPool.QueueUserWorkItem(WaitCallBackMethod, i);
   6:     }
   7:     Console.Read();
   8: }

QueueUserWorkItem()方法的第二個參數是個object類型的參數,可傳入一個數據到線程中。在主線程中,傳入了3個方法到線程池中。運行結果如下:

image

可以看見三個線程分別在行動。順序不一樣是因為操作系統調度的原因。

 

2、最大與最小線程數

ThreadPool類會在需要時增減池中線程的線程數,直到最大的線程數。池中的最大線程數是可配置的。在雙核CPU中,默認設置為1023個工作線程和1000個I/O線程。也可以指定在創建線程池時應立即啟動的最小線程數,以及線程池,中可用的最大線程數。如果有更多的作業要處理,線程池中線程的個數也到了極限,最新的作業就要排隊,且必須等待線程完成其任務。

可用下面的方法查看:

   1: static void MaxThreads()
   2: {
   3:     int workerThreads;
   4:     int ioThreads;
   5:  
   6:     ThreadPool.GetMaxThreads(out workerThreads, out ioThreads);
   7:     Console.WriteLine(String.Format("Max worker threads: {0};    Max I/O threads: {1}", workerThreads, ioThreads));
   8:  
   9:     ThreadPool.GetMinThreads(out workerThreads, out ioThreads);
  10:     Console.WriteLine(String.Format("Min worker threads: {0};    Min I/O threads: {1}", workerThreads, ioThreads));
  11: }

結果為:

image

 

3、線程池的限制

  • 線程池中的所有線程都是后台線程。如果進程的所有前台線程都結束了,所有的后台線程就會停止。不能把入池的線程改為前台線程。
  • 不能給入池的線程設置優先級或名稱。
  • 對於COM對象,入池的所有線程都是多線程單元(Multithreaded Apartment,MTA)線程。許多COM對象都需要單線程單元(Multithreaded Apartment,MTA)線程。
  • 入池的線程只能用於時間較短的任務。如果線程要一直運行(如Word的拼寫檢查器線程),就應使用Thread類創建一個線程。

 

參考資料:《C#高級編程》

 

本文源代碼:


免責聲明!

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



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