C#中Task異步的常用方法
C# 中的 Task 類是 System.Threading.Tasks 命名空間的一部分,用于表示異步操作。
一、Task.Run(Action action):
此靜態(tài)方法用于在后臺運行一個新任務,并返回與該任務關聯(lián)的 Task 實例。
- 本質是將任務放入線程池執(zhí)行,自動啟動,適合CPU 密集型或簡單異步操作。
 - 注意:返回的 
Task無法手動控制啟動(已自動啟動)。 
Task.Run(() => Console.WriteLine("后臺執(zhí)行"));二、Task.Start():
用于手動啟動通過 new Task(...) 創(chuàng)建的未啟動任務(默認狀態(tài)為 Created)。
var task = new Task(() => Console.WriteLine("手動啟動"));
task.Start(); // 必須調用才會執(zhí)行三、Task.Delay(int millisecondsDelay):
此靜態(tài)方法創(chuàng)建一個在指定延遲之后完成的 Task。這對于定時操作或模擬長時間運行的任務非常有用。
await Task.Delay(1000); // 等待1秒
四、任務等待相關方法(阻塞 vs 非阻塞)
| 方法 | 特性 | 適用場景 | 
|---|---|---|
| await Task.WhenAll | 非阻塞等待所有任務完成 | 異步方法中,需要等待多個任務全部完成后再繼續(xù) | 
| await Task.WhenAny | 非阻塞等待任一任務完成 | 異步方法中,只需等待最快完成的任務結果 | 
| Task.WaitAll | 阻塞當前線程等待所有任務 | 同步方法中強制等待(不推薦在異步代碼中使用) | 
| Task.WaitAny | 阻塞當前線程等待任一任務 | 同步方法中需立即響應第一個完成的任務 | 
| Task.Wait() | 阻塞當前線程等待單個任務 | 同步方法中等待單個任務(等價于 WaitAll 單任務) | 
關鍵區(qū)別:
await搭配WhenAll/WhenAny是非阻塞等待,會釋放當前線程,適合異步上下文(如 UI 線程),避免界面卡頓。Wait()/WaitAll()/WaitAny()是阻塞等待,會凍結當前線程,可能導致性能問題(如 UI 無響應),僅建議在純同步代碼中使用。
1.Task.WhenAll(Task[] tasks):
注意:由于此調用不會默認等待,需要再前面添加await。
var task1 = Task.Run(() => { /* 任務1 */ });
var task2 = Task.Run(() => { /* 任務2 */ });
 
await Task.WhenAll(task1, task2);2.Task.WhenAny(Task[] tasks):
注意:由于此調用不會默認等待,需要再前面添加await。
var task1 = Task.Run(() => { /* 任務1 */ });
var task2 = Task.Run(() => { /* 任務2 */ });
 
var completedTask = await Task.WhenAny(task1, task2);3.Task.Wait():
var task = Task.Run(() => { /* 代碼 */ });
task.Wait();4.Task.WaitAll(Params Task[])
var task1 = Task.Run(() => { /* 任務1 */ });
var task2 = Task.Run(() => { /* 任務2 */ });
 
var completedTask = Task.WaitAll(task1, task2);5.Task.WaitAny(Params Task[])
var task1 = Task.Run(() => { /* 任務1 */ });
var task2 = Task.Run(() => { /* 任務2 */ });
 
var completedTask = Task.WaitAny(task1, task2);五、Task.ContinueWith(Action continuationAction):
此方法用于在當前任務完成后執(zhí)行另一個操作。這對于鏈式(嵌套)任務執(zhí)行非常有用。(等待一個任務完成)
// 正常情況下 t1 和 t2 不知道誰先執(zhí)行完
Task<string> t1 = new Task<string>(F1);
Task<string> t2 = new Task<string>(F2);
Task<string> t3 = new Task<string>(F3);
 
//t1先執(zhí)行 t2后執(zhí)行 
t1.ContinueWith(t =>
{
    // t1執(zhí)行完之后 再去執(zhí)行
    t2.Start(); //第二任務
    t2.ContinueWith(t4 =>
    {
        //第二個任務完成了
        //第三個任務對象
        t3.Start();
        t3.ContinueWith(t5 =>
        {
            Console.WriteLine("保證第三個任務完成");
        });
    });
});注意:在使用 Task 類時,應始終考慮處理異常和取消操作。這可以通過使用 try-catch 語句和 CancellationToken 來實現(xiàn)。
到此這篇關于C#中Task異步的常用方法的文章就介紹到這了,更多相關C# Task異步用法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
 通過?C#/VB.NET?代碼將?Excel?工作表拆分為單獨的文件
這篇文章主要介紹了通過C#/VB.NET代碼將Excel工作表拆分為單獨的文件,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09

