先引入一下線程池的概念:html
百度百科:線程池是一種多線程處理形式,處理過程當中將任務添加到隊列,而後在建立線程後自動啓動這些任務。線程池線程都是後臺線程。每一個線程都使用默認的堆棧大小,以默認的優先級運行,並處於多線程單元中。若是某個線程在託管代碼中空閒(如正在等待某個事件),則線程池將插入另外一個輔助線程來使全部處理器保持繁忙。若是全部線程池線程都始終保持繁忙,但隊列中包含掛起的工做,則線程池將在一段時間後建立另外一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程能夠排隊,但他們要等到其餘線程完成後才啓動。多線程
線程池主要方法:異步
// 參數: // workerThreads: // 要由線程池根據須要建立的新的最小工做程序線程數。 // completionPortThreads: // 要由線程池根據須要建立的新的最小空閒異步 I/O 線程數。// 返回結果:若是更改爲功,則爲 true;不然爲 false。 [SecuritySafeCritical] public static bool SetMinThreads(int workerThreads, int completionPortThreads); // 參數: // workerThreads: // 線程池中輔助線程的最大數目。 // completionPortThreads: // 線程池中異步 I/O 線程的最大數目。 // 返回結果:若是更改爲功,則爲 true;不然爲 false。 [SecuritySafeCritical] public static bool SetMaxThreads(int workerThreads, int completionPortThreads);
先來看一個簡單的例子:spa
public class Program { const int cycleNum = 10; static void Main(string[] args) { ThreadPool.SetMinThreads(1,1); ThreadPool.SetMaxThreads(5, 5); for(int i = 1; i <= cycleNum; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(testFun),i.ToString()); } Console.WriteLine("主線程執行!"); Console.WriteLine("主線程結束!"); Console.ReadKey(); } public static void testFun(object obj) { Console.WriteLine(string.Format("{0}:第{1}個線程",DateTime.Now.ToString(),obj.ToString())); Thread.Sleep(5000); } }附上結果:線程
這裏能夠看出,線程池裏線程的執行不影響主線程的運行,線程池雖然能夠管理多線程的執行,可是卻沒法知道它何時終止。這時候咱們能夠利用以前講的信號燈AutoResetEvent和ManualResetEvent來解決問題,對此還不瞭解的朋友能夠參見多線程之AutoResetEvent。code
上面代碼稍加改動,以下:orm
public class Program { const int cycleNum = 10;
static int cnt = 10; static AutoResetEvent myEvent = new AutoResetEvent(false); static void Main(string[] args) { ThreadPool.SetMinThreads(1,1); ThreadPool.SetMaxThreads(5, 5); for(int i = 1; i <= cycleNum; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(testFun),i.ToString()); } Console.WriteLine("主線程執行!"); Console.WriteLine("主線程結束!"); myEvent.WaitOne(); Console.WriteLine("線程池終止!"); Console.ReadKey(); } public static void testFun(object obj) {
cnt -= 1; Console.WriteLine(string.Format("{0}:第{1}個線程",DateTime.Now.ToString(),obj.ToString())); Thread.Sleep(5000); if (cnt == 0) { myEvent.Set(); } } }這裏,當線程池中全部線程執行完成後,能夠捕獲到該事件,咱們就能夠利用此方法來獲取線程池終止事件了,執行結果以下:htm
做者:依封劍白 出處:C#多線程--線程池(ThreadPool) 本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。若有問題或建議,請多多賜教,很是感謝。