線程池是C#並行開發的基礎,C#中的Task、委托的非同步等,內部使用的都是線程池。線程池中所有的線程都是後臺線程。 線程池顧名思義,擁有一定數量的活動線程,供程式調用。在windows系統中,進程是程式資源的集合,線程則是真正的執行單元,如果一個主機有多個邏輯CPU,程式就可以並行運行。但是建立線程 ...
線程池是C#並行開發的基礎,C#中的Task、委托的非同步等,內部使用的都是線程池。線程池中所有的線程都是後臺線程。
線程池顧名思義,擁有一定數量的活動線程,供程式調用。在windows系統中,進程是程式資源的集合,線程則是真正的執行單元,如果一個主機有多個邏輯CPU,程式就可以並行運行。但是建立線程需要耗費時間,消耗記憶體,如果頻繁的建立和銷毀會很影響程式性能。線程池機制則可以很好的彌補這一點。當使用線程池執行非同步任務時,任務調度器會將任務放到線程池中的線程中執行,任務完成後也不會銷毀線程,而是繼續等待執行用戶的其他任務。如果線程池中的線程都在執行任務,則線程池就會建立新的線程。
//獲得最小線程數 int minWorkerThread, minPortThread; ThreadPool.GetMinThreads(out minWorkerThread, out minPortThread); Console.WriteLine(minWorkerThread.ToString()+" "+ minPortThread.ToString()); //獲得最大線程數 int maxWorkerThread, maxPortThread; ThreadPool.GetMaxThreads(out maxWorkerThread, out maxPortThread); Console.WriteLine(maxWorkerThread.ToString() + " " + maxPortThread.ToString()); //獲得可以建立的線程數(即最大線程數和線程池中已經存在的線程數的差值) int availableWorkerThread, availablePortThread; ThreadPool.GetAvailableThreads(out availableWorkerThread, out availablePortThread); Console.WriteLine(availableWorkerThread.ToString() + " " + availablePortThread.ToString());
線程池線程設置有最小線程數和最大線程數,最小線程數一般和邏輯CPU數量相當。而最大線程數,在.net4.0中分別是32767(工作線程),1000(IO線程)。最大線程數和最小線程數可以設置。當線程池中的線程數量低於最小線程數時,如果此時需要新的線程,會立即建立。而當大於最小線程數時,線程池會等待500毫秒來觀察是否需要建立新的線程。所以此時建立新的線程的時間會大於500毫秒。當已經達到最大線程數時,就不會再建立新的線程。如果有新的任務,線程池會讓任務排隊等待,直到有可用的線程。另外,當線程池線程空閑時,一定的時間後會自動銷毀。
線程池一般用來執行時間較短、對任務的開始執行時間和執行順序要求不嚴格的任務,這樣能最大限度的利用線程池的優勢。另外,超過最小線程數時建立新的線程時間會大於500毫秒,可以根據需要修改線程池線程最小線程數量來滿足程式的實際需要。
// 在這裡只設置工作線程 //根據需要設置 int appMinThreadCount =5; //獲得最小線程數 int minWorkerThread, minPortThread; ThreadPool.GetMinThreads(out minWorkerThread, out minPortThread); if (appMinThreadCount > minPortThread) { var result=ThreadPool.SetMinThreads(appMinThreadCount, minPortThread); //返回值用來判斷是否設置成功 Console.WriteLine(result); }