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

C# 多執行緒參數傳遞三大技巧:建構函式、ThreadPool 與非同步委派

     編輯:關於C#

問題背景

.NET Thread.Start() 僅接受無參數的 ThreadStart 委派,若需向執行緒方法傳遞參數,需採用間接方式。本文介紹三種常用模式,並說明適用場景。

方法一:透過建構函式預存參數

public class Worker
{
    private readonly string _param;
    public Worker(string param) => _param = param;
    public void DoWork() => Console.WriteLine(_param);
}

// 使用
var w = new Worker("ParameterValue");
new Thread(w.DoWork).Start();
  • 優點:簡單直觀,適合參數固定、生命週期與物件綁定的情境。
  • 缺點:破壞封裝(需暴露欄位/屬性)、每組參數需建立新實例、無法取得回傳值。

方法二:ThreadPool.QueueUserWorkItem

public class Worker
{
    public void DoWork(object state) => Console.WriteLine((string)state);
}

// 使用
ThreadPool.QueueUserWorkItem(new WaitCallback(new Worker().DoWork), "ParameterValue");
  • 優點:利用執行緒池避免頻繁建立/銷毀執行緒開銷,state 參數型別為 object 可傳遞任意資料。
  • 缺點:無法直接取得回傳值、例外處理較麻煩、不適合長時間運行工作(會佔用池資源)。

方法三:非同步委派

delegate string WorkDelegate(string param);

public class Worker
{
    public string DoWork(string p) => $"結果:{p}";
}

// 使用
var worker = new Worker();
WorkDelegate d = worker.DoWork;
d.BeginInvoke("paramValue", ar => {
    var result = d.EndInvoke(ar);
    Console.WriteLine(result);
}, null);
  • 優點:支援回傳值、例外自動傳播至 EndInvoke、可透過 IAsyncResult 狀態輪詢/等待。
  • 缺點:APM 模式程式碼較繁瑣,現代開發建議改用 Task/async-await。

多參數傳遞技巧

封裝為物件或 Tuple:

// 匿名型別
ThreadPool.QueueUserWorkItem(_ => {
    var p = (dynamic)_;
    Console.WriteLine($"{p.P1} + {p.P2}");
}, new { P1 = "A", P2 = "B" });

// 非同步委派多參數
delegate string MultiDelegate(string p1, string p2);

現代替代方案:Task Parallel Library

// .NET 4.0+ 推薦寫法
Task.Run(() => DoWork("param"));                    // 無回傳值
var result = await Task.Run(() => Compute("param")); // 有回傳值、異常處理自然

Task 統一了工作排程、回傳值、取消、例外處理,是現代 .NET 非同步程式設計的標準抽象。

總結選擇指南

場景建議方案
簡單背景工作、參數固定建構函式 + Thread
大量短時工作、需效能ThreadPool / Task.Run
需回傳值、例外處理、續作邏輯async-await / Task
Legacy 專案維護非同步委派 (APM)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved