首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

多線程入門系列(十一):ThreadPool 線程池完整解析

     編輯:關於C#

21.7 線程池

本系列面向初學者,針對首次接觸線程概念的讀者。高手請見諒,歡迎批評指教。

說明

線程池相關程式碼用到委派概念,請參考委派相關內容。

核心概念

  • 線程池:預先建立一組可重用的線程,避免頻繁建立/銷毀線程的開銷。
  • ThreadPool.QueueUserWorkItem:將工作項目排入佇列,由池中閒置線程執行。
  • 適用場景:短時間、高頻率的背景工作;不適用於長時間運行或需精確控制生命週期的任務。

關鍵 API

基本使用範例

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Console.WriteLine("主線程 ID: {0}", Thread.CurrentThread.ManagedThreadId);
        
        // 簡單排入工作
        ThreadPool.QueueUserWorkItem(WorkMethod, "工作項目 1");
        ThreadPool.QueueUserWorkItem(WorkMethod, "工作項目 2");
        
        Console.WriteLine("主線程繼續執行...");
        Thread.Sleep(1000); // 等待工作完成
        Console.WriteLine("主線程結束");
    }
    
    static void WorkMethod(object state)
    {
        Console.WriteLine("執行緒 ID: {0}, 狀態: {1}", 
            Thread.CurrentThread.ManagedThreadId, state);
        Thread.Sleep(500); // 模擬工作
    }
}

進階:搭配 WaitHandle 等待完成

using System;
using System.Threading;

class Program
{
    static ManualResetEvent[] doneEvents;
    
    static void Main()
    {
        int taskCount = 5;
        doneEvents = new ManualResetEvent[taskCount];
        
        for (int i = 0; i < taskCount; i++)
        {
            doneEvents[i] = new ManualResetEvent(false);
            ThreadPool.QueueUserWorkItem(WorkMethod, i);
        }
        
        WaitHandle.WaitAll(doneEvents);
        Console.WriteLine("所有工作完成");
    }
    
    static void WorkMethod(object state)
    {
        int index = (int)state;
        Console.WriteLine("任務 {0} 開始,線程 {1}", index, Thread.CurrentThread.ManagedThreadId);
        Thread.Sleep(1000);
        Console.WriteLine("任務 {0} 結束", index);
        doneEvents[index].Set();
    }
}

注意事項

  • 線程池線程為背景線程,主程式結束時會強制終止。
  • 避免在線程池執行長時間阻塞操作(如同步 I/O、Thread.Sleep 長延遲),會耗盡池資源。
  • .NET 4+ 建議使用 Task / Task.Run 取代 ThreadPool,功能更豐富。
  • 異常處理:工作項目內的未捕獲異常會導致進程終止,務必在工作方法內 try-catch。

圖示說明

(原文包含四張圖片,展示線程池運作流程、API 結構、範例輸出等)

線程池概念圖 1線程池概念圖 2線程池程式碼範例線程池執行結果
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法/屬性說明
QueueUserWorkItem(WaitCallback)排入無參數工作項目
QueueUserWorkItem(WaitCallback, Object)排入帶狀態物件的工作項目
GetMaxThreads取得最大線程數
GetMinThreads取得最小閒置線程數
SetMaxThreads設定最大線程數
SetMinThreads設定最小閒置線程數