大家都知道這個線程的建立和銷毀都需要很大的性能開銷,當有比較多且不同的任務需要完成時,可以考慮使用線程池來管理這些線程。在以windows NT為內核的操作系統上每個進程都包含一個線程池,在線程池中存在許多可以被隨時使用的線程,當應用程序使用時,可以從線程池中直接取出一個已經存在的線程,當某個線程使用完成后,不會立即銷毀,而是放入線程池中等待下一次的使用。
在C#中,通過System .Threading.ThreadPool提供了以下的常用方法和說明。
方法名稱 | 說明 |
BindHandle | 將操作系統句柄綁定到ThreadPool。 |
GetAvailableThreads | 檢索由GetMaxThreads方法返回的最大線程數和當前活動線程數之間的差值。 |
GetMaxThreads | 檢索同時處於活動狀態的線程池請求的數目,所有大於此數目的請求將保持排隊狀態,直到線程池線程變為可用。 |
GetMinThreads | 檢索線程池在新請求預測中維護的空閑線程數。 |
QueueUserWorkItem | 將方法排入隊列以便執行,此方法在有線程池線程變得可用時執行。 |
RegisterWaitForSingleObject | 注冊正在等待WaitHandle的委托。 |
SetMaxThreads | 設置可以同時處於活動狀態的線程池的請求數目。所有大於此數目的請求將保持排隊狀態,直到線程池線程變得可用。 |
SetMinThreads | 設置線程池在新請求預測中維護的空閑線程數。 |
UnsafeQueueUserWorkItem | 注冊一個等待WaitHandle的委托。 |
UnRegisterWaitForSingleObject | 將指定的委托排隊到線程池。 |
舉個例子:
static void Main(string[] args) { int intWorkThreads; int intCompletionPortThreads; ThreadPool.GetMaxThreads(out intWorkThreads, out intCompletionPortThreads); Console.WriteLine("最大工作線程數:{0},最大I/O線程數:{1}",intWorkThreads,intCompletionPortThreads); //獲取最大線程數的信息。 for (int i = 0; i < 3; i++) { ThreadPool.QueueUserWorkItem(TestThreadPool);//在線程池中申請使用線程。 } Console.ReadLine(); } static void TestThreadPool(object obj) { for (int i = 0; i < 3; i++) { //Thread.CurrentThread.ManagedThreadId獲取正在運行的線程的標識。 Console.WriteLine("線程池中,正在運行的線程的唯一標識為{0}",Thread.CurrentThread.ManagedThreadId); } Thread.Sleep(100); }
線程池中運行的線程都是后台線程,就是線程池中的所有線程的IsBackground屬性都被設置為True,后台線程不會影響應用程序的結束,而前台的線程對應用程序的結束會有很大影響,因為應用程序的退出必須等待所有的前台線程結束。