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

淺談 .NET 多線程與並行計算(六):線程池基礎(下)

     編輯:關於ASP.NET

自訂簡易線程池實現

核心需求:

  1. 池中線程數維持在最小/最大值之間
  2. 不足時創建、閒置時回收
  3. 任務排隊,無可用線程時等待

僅示範核心邏略,不考慮效能優化(如延遲創建)與異常處理。

1. 封裝工作項目

public class WorkItem
{
    public WaitCallback Action { get; set; }
    public object State { get; set; }

    public WorkItem(WaitCallback action, object state)
    {
        this.Action = action;
        this.State = state;
    }
}

2. 線程池中的單一工作線程

public class SimpleThreadPoolThread
{
    private object locker = new object();
    private AutoResetEvent are = new AutoResetEvent(false);
    private WorkItem wi;
    private Thread t;
    private bool b = true;
    private bool isWorking;

    public bool IsWorking
    {
        get
        {
            lock (locker) { return isWorking; }
        }
    }
    public event Action<SimpleThreadPoolThread> WorkComplete;

    public SimpleThreadPoolThread()
    {
        lock (locker) { isWorking = false; }
        t = new Thread(Work) { IsBackground = true };
        t.Start();
    }

    public void SetWork(WorkItem wi) { this.wi = wi; }

    public void StartWork() { are.Set(); } // 發出信號開始工作

    public void StopWork()
    {
        wi = null;      // 空任務
        b = false;      // 停止迴圈
        are.Set();      // 釋放等待結束線程
    }

    private void Work()
    {
        while (b)
        {
            are.WaitOne(); // 無任務時等待
            if (wi != null)
            {
                lock (locker) { isWorking = true; }
                wi.Action(wi.State); // 執行任務
                lock (locker) { isWorking = false; }
                WorkComplete(this);  // 觸發完成事件
            }
        }
    }
}

此簡易線程池展示核心機制:背景線程 + AutoResetEvent 信號 + 工作項目隊列 + 完成事件通知。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved