線程池使用起來很簡單,但它有一些限制: 線程池中的所有線程都是後臺線程。如果進程的所有前臺線程都結束了,所有的後臺線程就會停止。不能把入池的線程改為前臺線程。 不能給入池的線程設置優先順序或名稱。 對於COM對象,入池的所有線程都是多線程單元線 程。許多COM對象都需要單線程單元線程。 入池的線程只能 ...
線程池使用起來很簡單,但它有一些限制:
- 線程池中的所有線程都是後臺線程。如果進程的所有前臺線程都結束了,所有的後臺線程就會停止。不能把入池的線程改為前臺線程。
- 不能給入池的線程設置優先順序或名稱。
- 對於COM對象,入池的所有線程都是多線程單元線 程。許多COM對象都需要單線程單元線程。
- 入池的線程只能用於時間較短的任務。如果線程要一直運行(如 Word的拼寫檢查器線程),就應使用 Thread類創建一個線程。
代碼示例:
class ThreadPoolDemo { public static void start() { int workerThreads, completionPortThreads; //設置線程最大值 ThreadPool.SetMaxThreads(5, 5); ////設置線程最小值 ThreadPool.SetMinThreads(2, 2); //檢索線程池在新請求預測中維護的空閑線程數 ThreadPool.GetMinThreads(out workerThreads, out completionPortThreads); Console.WriteLine("workerThreads:" + workerThreads); Console.WriteLine("completionPortThreads:" + workerThreads); //綁定線程,當有可用線程時執行。 ThreadPool.QueueUserWorkItem(WaitCallback, "第1個"); ThreadPool.QueueUserWorkItem(WaitCallback, "第2個"); ThreadPool.QueueUserWorkItem(WaitCallback, "第3個"); ThreadPool.QueueUserWorkItem(WaitCallback, "第4個"); ThreadPool.QueueUserWorkItem(WaitCallback, "第5個"); ThreadPool.QueueUserWorkItem(WaitCallback, "第6個"); ThreadPool.QueueUserWorkItem(WaitCallback, "第7個"); ThreadPool.QueueUserWorkItem(WaitCallback, "第8個"); ThreadPool.QueueUserWorkItem(WaitCallback, "第9個"); ThreadPool.QueueUserWorkItem(WaitCallback, "第10個"); } static void WaitCallback(object state) { Console.WriteLine("線程調用" + state); int workerThreads, completionPortThreads; //檢測可用線程和io線程數 ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads); Console.WriteLine("workerThreads:" + workerThreads); Console.WriteLine("completionPortThreads:" + workerThreads); Thread.Sleep(2000); if ("第2個" == state.ToString()) { Thread.Sleep(6000); } Console.WriteLine(state + "調用結束"); } }View Code