Task 是 TPL 核心類別,代表一項非同步工作。本文涵蓋建立方式、參數傳遞、結果取得與進階建構選項。
// 1. 命名方法委托
Task task1 = new Task(new Action(PrintMessage));
// 2. 匿名委托
Task task2 = new Task(delegate { PrintMessage(); });
// 3. Lambda + 命名方法
Task task3 = new Task(() => PrintMessage());
// 4. Lambda + 匿名方法(最常用)
Task task4 = new Task(() => { Console.WriteLine("Hello"); });
啟動:task.Start()。或一步到位:Task.Factory.StartNew(() => ...)。
string[] msgs = { "First", "Second", "Third" };
foreach (var msg in msgs) {
Task t = new Task(obj => PrintMessage((string)obj), msg);
t.Start();
}
// 必須在執行體內轉型為原始型別
// 手動建立
Task<int> task = new Task<int>(() => {
int sum = 0;
for (int i = 0; i < 100; i++) sum += i;
return sum;
});
task.Start();
Console.WriteLine(task.Result); // 封鎖直到完成
// Factory 一步到位
Task<int> task2 = Task.Factory.StartNew<int>(() => { ... return sum; });
Console.WriteLine(task2.Result);
| 選項 | 說明 |
|---|---|
None | 預設行為 |
PreferFairness | 請求排程器公平排程 |
LongRunning | 提示長時間執行,排程器可能建立專用執行緒 |
AttachedToParent | 建立父子任務關係,父任務等待子任務完成 |
Task.CurrentId:執行體內取得唯一任務 ID,外部存取為 nullSystem.Threading.Tasks、System.Threading