一文吃透 C#中異步編程Task
- 一、Task 是什么
- 二、推薦使用場景
- 三、Demo:Task 的核心用法
-
- 1. 最常用的啟動方式Task.Run
- 2. task完成狀態與結果獲取
- 3. 多個任務怎么等?Wait/WaitAll/WaitAny
- 4. 任務想中途停掉?取消與異常處理
- 四、必備 API 速查表
- 五、避坑指南、注意事項
- 總結
一文吃透 C#中異步編程Task
一、Task 是什么
Task 是 C# 中用于處理異步操作的類,從.NET Framework 4 開始引入。它不像 Thread 需要手動管理線程生命周期,而是基于線程池自動調度,輕量又好控制。Task的關鍵特點:
- 異步執行:在后臺線程執行,不阻塞主線程
- 狀態可控制:能隨時知道任務是 “正在跑”、“已完成” 還是 “被取消”
- 支持返回值:能返回操作結果,方便后續使用
二、推薦使用場景
Task 雖好,但并非所有場景都適用。以下場景適合發揮它的優勢:
- 復雜計算:如圖像處理、數據分析這類耗時操作,放到 Task 里在后臺執行,不影響用戶操作界面
- 多任務并行:同時執行多個獨立任務,像同時下載多個文件,每個下載任務用一個 Task,提高整體效率
- 后臺任務:如定期清理緩存、日志記錄等后臺操作,適合用 Task 在后臺默默執行
三、Demo:Task 的核心用法
1. 最常用的啟動方式Task.Run
- 不用手動創建線程,Task 會自動從線程池拿資源(線程池無空閑線程時會自動創建)
- 適合大多數簡單異步場景,推薦優先使用
static void BasicTaskDemo()
{// 用Task.Run啟動一個任務,自動在后臺執行Task.Run(() => {Thread.Sleep(500); // 模擬耗時操作Console.WriteLine($"BasicTaskDemo Task End,線程ID: {Thread.CurrentThread.ManagedThreadId}"); }); // Task<int> task = Task.Run(() => 100 + 200); /返回值
}
2. task完成狀態與結果獲取
- 結果已知或同步可得,優先用 FromResult 包裝為 Task,避免不必要的線程調度和等待
- 若需異步計算,使用 Task.Run 或其他異步方式,Result會阻塞當前線程
static string Now() => DateTime.Now.ToString("HH:mm:ss.fff");
static void FromResultDemo()
{// 場景1:Task.FromResult:創建已完成的任務,立即可用,僅僅是把已知結果包裝為Task(不耗時)Task<int> fromResultTask = Task.FromResult(123); Console.WriteLine($"{Now()} fromResultTask 已完成: IsCompleted={fromResultTask.IsCompleted}, Result={fromResultTask.Result}"); // 場景2:需要異步計算,用Task.RunTask<int> runTask = Task