一.簡介
提供一個線程池,該線程池可用於執行任務、發送工作項、處理異步 I/O、代表其他線程等待以及處理計時器
注意:線程池中啟動的線程都是后台線程
二.主要方法
GetAvailableThreads(Int32, Int32) | 線程池中空閑線程數,檢索由 GetMaxThreads(Int32, Int32) 方法返回的最大線程池線程數和當前活動線程數之間的差值。 |
GetMaxThreads(Int32, Int32) | 檢索可以同時處於活動狀態的線程池請求的數目。 所有大於此數目的請求將保持排隊狀態,直到線程池線程變為可用。 |
GetMinThreads(Int32, Int32) | 發出新的請求時,在切換到管理線程創建和銷毀的算法之前檢索線程池按需創建的線程的最小數量。 |
QueueUserWorkItem(WaitCallback) | 將方法排入隊列以便執行。 此方法在有線程池線程變得可用時執行。 |
QueueUserWorkItem(WaitCallback, Object) | 將方法排入隊列以便執行,並指定包含該方法所用數據的對象。 此方法在有線程池線程變得可用時執行。 |
SetMaxThreads(Int32, Int32) | 設置可以同時處於活動狀態的線程池的請求數目。 所有大於此數目的請求將保持排隊狀態,直到線程池線程變為可用。 |
SetMinThreads(Int32, Int32) | 發出新的請求時,在切換到管理線程創建和銷毀的算法之前設置線程池按需創建的線程的最小數量。 |
三.使用
1.QueueUserWorkItem
(1)回調不帶參數
private static void fun2() { for (int i = 0; i < 10; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(t => { Console.WriteLine($"Thread ThreadId:{Thread.CurrentThread.ManagedThreadId}"); })); } }
運行結果:
(2)回調帶參數
private static void fun1() { for (int i = 0; i < 10; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(t => { Console.WriteLine($"Thread {t} ThreadId:{Thread.CurrentThread.ManagedThreadId}"); }), i); } }
運行結果:
四.workerThreads和completionPortThreads
CLR線程池分為工作者線程(workerThreads)與I/O線程(completionPortThreads)兩種:
(1)workerThreads:工作者線程是主要用作管理CLR內部對象的運作,通常用於計算密集的任務。
(2)completionPortThreads:I/O(Input/Output)線程主要用於與外部系統交互信息,如輸入輸出。
參考:
https://www.cnblogs.com/kissdodog/archive/2013/03/28/2986026.html