?
前言
嗨,程序員小伙伴們,早上好!
想象一下,你正在一家忙碌的咖啡館里工作,顧客絡繹不絕,你不停地跑前跑后,累得直喘氣。
如果你能同時準備幾杯咖啡,效率是不是會大大提高?
這就是并發編程的魅力所在。
今天,我們就來聊聊 C# 中的 Task
,看看它是如何幫助我們在代碼中實現“多任務并行”的奇跡。
1. Task.Run:簡單高效的啟動方式
// 使用 Task.Run 來快速啟動一個后臺任務
Task.Run(() =>
{
Console.WriteLine($"任務運行在線程 {Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(1000); // 模擬耗時操作
Console.WriteLine("任務完成!");
});
解釋:這是最常用的啟動異步任務的方法,適合執行一些不需要立即返回結果的操作。
2. Task.Factory.StartNew:靈活應對各種需求
// 使用 Task.Factory.StartNew 來處理長時間運行的任務
Task.Factory.StartNew(() =>
{
Console.WriteLine($"任務運行在線程 {Thread.CurrentThread.ManagedThreadId}");
// 模擬CPU密集型計算
for (int i = 0; i < 1000000; i++) {}
}, TaskCreationOptions.LongRunning); // 提示這是一個長任務
提示:對于需要較長時間才能完成的任務,這種方式可以提供更多的控制選項。
3. new Task:手動管理任務
var task = new Task(() =>
{
Console.WriteLine($"任務運行在線程 {Thread.CurrentThread.ManagedThreadId}");
File.WriteAllText("test.txt", "Hello Task!");
});
task.Start(); // 需要手動啟動任務
注意:雖然這種方法提供了對任務生命周期的完全控制,但在大多數情況下,推薦使用更簡便的方式。
4. 多任務并行處理
var tasks = new List<Task>();
for (int i = 0; i < 5; i++)
{
int taskId = i; // 避免閉包陷阱
tasks.Add(Task.Run(() =>
{
Console.WriteLine($"任務{taskId}開始執行");
Thread.Sleep(1000 * (taskId + 1));
Console.WriteLine($"任務{taskId}完成");
}));
}
await Task.WhenAll(tasks); // 等待所有任務完成
Console.WriteLine("所有任務都完成了!");
小貼士:合理利用多任務并行處理,可以大幅縮短程序的執行時間。
5. 帶返回值的任務
Task<int> fibonacciTask = Task.Run(() =>
{
int Fib(int n) => n <= 1 ? n : Fib(n - 1) + Fib(n - 2);
return Fib(35); // 計算斐波那契數列第35項
});
Console.WriteLine("正在拼命計算中...");
int result = await fibonacciTask;
Console.WriteLine($"計算結果: {result}");
亮點:通過返回值,你可以輕松地在異步任務完成后獲取其結果。
6. 任務鏈式調用
Task.Run(() =>
{
Console.WriteLine("第一階段:數據準備");
return "原始數據";
})
.ContinueWith(previousTask =>
{
Console.WriteLine($"第二階段:處理 {previousTask.Result}");
return $"處理后的-{previousTask.Result}";
})
.ContinueWith(previousTask =>
{
Console.WriteLine($"第三階段:存儲 {previousTask.Result}");
File.WriteAllText("data.txt", previousTask.Result);
});
好處:鏈式調用不僅能讓代碼看起來更整潔,還能確保各階段按順序執行。
總結
恭喜你,現在你應該已經掌握了使用 Task
進行多線程編程的基礎知識和一些高級技巧。
記住,實踐是檢驗真理的唯一標準。
嘗試將這些技巧應用到你的項目中去吧,你會發現它們不僅能幫你解決問題,還能為你的編程技能加分不少。
該文章在 2025/6/16 9:43:25 編輯過