//ThreadPool(線程池)是一個靜態類,它沒有定義任何的構造方法(),我們只能夠使用它的靜態方法,這是因為,這是因為ThreadPool是托管線程池,是由CLR管理的。
//ThreadPool使用WaitCallback委托,它所要做的工作是在後台進行的。使工作項的排隊和運行更容易,可以給工作者線程傳遞一個狀態對象(提供數據)。狀態對象是私有的作用域位於線程層,所以不需要進行同步。
//ThreadPool目標是為了減除線程的初始化開銷,實現並行處理。.NET類庫中的ThreadPool是異步IO的基礎,比如,在System.Net.Socket中,我們可以使用BeginAccept , EndAccept將Socket需要阻塞的操作放到系統的線程池中運行,而在執行結束以後通知主線程。
//一個ThreadPool裡面注冊的線程擁有默認的堆棧大小,默認的優先級。並且,他們都存在於多線程空間(Multithreaded apartment)中。
//ThreadPool中的Thread不能手動取消,也不用手動開始。所以ThreadPool並不適用比較長的線程。你要做的只是把一個WaitCallback委托塞給ThreadPool,然後剩下的工作將由系統自動完成。系統會在ThreadPool的線程隊列中一一啟動線程。
//當線程池滿時,多余的線程會在隊列裡排隊,當線程池空閒時,系統自動掉入排隊的線程,以保持系統利用率。
//我們的程序中使用ThreadPool來進行一些比較耗時或者需要阻塞的操作。當學要復雜的同步技術,例如事件,或需要對一個現場表調用Join方法時線程池就不能滿足需求了.在以下情況中不宜使用ThreadPool而應該使用單獨的Thread:
//1,需要為線程指定詳細的優先級
//2,線程執行需要很長時間
//3,需要把線程放在單獨的線程apartment中
//4,在線程執行中需要對線程操作,如打斷,掛起等。
//通常是將計算密集型的操作放在worker線程池中運行,而線程池的大小會根據當前的CPU使用量自動調整,通過下面兩個方法,我們可以設置線程池的大小:
//ThreadPool.SetMaxThreads(10, 200);
//ThreadPool.SetMinThreads(2, 40);
//兩個參數分別是WorkThread和IO thread的限制。
先看一個簡單的例子(運行結果不會每次都一樣,這應該是ThreadPool後台處理的正常反應)