C#中Task異步的常用方法
C# 中的 Task 類是 System.Threading.Tasks 命名空間的一部分,用于表示異步操作。
一、Task.Run(Action action):
此靜態(tài)方法用于在后臺(tái)運(yùn)行一個(gè)新任務(wù),并返回與該任務(wù)關(guān)聯(lián)的 Task 實(shí)例。
- 本質(zhì)是將任務(wù)放入線程池執(zhí)行,自動(dòng)啟動(dòng),適合CPU 密集型或簡(jiǎn)單異步操作。
- 注意:返回的
Task無法手動(dòng)控制啟動(dòng)(已自動(dòng)啟動(dòng))。
Task.Run(() => Console.WriteLine("后臺(tái)執(zhí)行"));二、Task.Start():
用于手動(dòng)啟動(dòng)通過 new Task(...) 創(chuàng)建的未啟動(dòng)任務(wù)(默認(rèn)狀態(tài)為 Created)。
var task = new Task(() => Console.WriteLine("手動(dòng)啟動(dòng)"));
task.Start(); // 必須調(diào)用才會(huì)執(zhí)行三、Task.Delay(int millisecondsDelay):
此靜態(tài)方法創(chuàng)建一個(gè)在指定延遲之后完成的 Task。這對(duì)于定時(shí)操作或模擬長(zhǎng)時(shí)間運(yùn)行的任務(wù)非常有用。
await Task.Delay(1000); // 等待1秒
四、任務(wù)等待相關(guān)方法(阻塞 vs 非阻塞)
| 方法 | 特性 | 適用場(chǎng)景 |
|---|---|---|
| await Task.WhenAll | 非阻塞等待所有任務(wù)完成 | 異步方法中,需要等待多個(gè)任務(wù)全部完成后再繼續(xù) |
| await Task.WhenAny | 非阻塞等待任一任務(wù)完成 | 異步方法中,只需等待最快完成的任務(wù)結(jié)果 |
| Task.WaitAll | 阻塞當(dāng)前線程等待所有任務(wù) | 同步方法中強(qiáng)制等待(不推薦在異步代碼中使用) |
| Task.WaitAny | 阻塞當(dāng)前線程等待任一任務(wù) | 同步方法中需立即響應(yīng)第一個(gè)完成的任務(wù) |
| Task.Wait() | 阻塞當(dāng)前線程等待單個(gè)任務(wù) | 同步方法中等待單個(gè)任務(wù)(等價(jià)于 WaitAll 單任務(wù)) |
關(guān)鍵區(qū)別:
await搭配WhenAll/WhenAny是非阻塞等待,會(huì)釋放當(dāng)前線程,適合異步上下文(如 UI 線程),避免界面卡頓。Wait()/WaitAll()/WaitAny()是阻塞等待,會(huì)凍結(jié)當(dāng)前線程,可能導(dǎo)致性能問題(如 UI 無響應(yīng)),僅建議在純同步代碼中使用。
1.Task.WhenAll(Task[] tasks):
注意:由于此調(diào)用不會(huì)默認(rèn)等待,需要再前面添加await。
var task1 = Task.Run(() => { /* 任務(wù)1 */ });
var task2 = Task.Run(() => { /* 任務(wù)2 */ });
await Task.WhenAll(task1, task2);2.Task.WhenAny(Task[] tasks):
注意:由于此調(diào)用不會(huì)默認(rèn)等待,需要再前面添加await。
var task1 = Task.Run(() => { /* 任務(wù)1 */ });
var task2 = Task.Run(() => { /* 任務(wù)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(() => { /* 任務(wù)1 */ });
var task2 = Task.Run(() => { /* 任務(wù)2 */ });
var completedTask = Task.WaitAll(task1, task2);5.Task.WaitAny(Params Task[])
var task1 = Task.Run(() => { /* 任務(wù)1 */ });
var task2 = Task.Run(() => { /* 任務(wù)2 */ });
var completedTask = Task.WaitAny(task1, task2);五、Task.ContinueWith(Action continuationAction):
此方法用于在當(dāng)前任務(wù)完成后執(zhí)行另一個(gè)操作。這對(duì)于鏈?zhǔn)?嵌套)任務(wù)執(zhí)行非常有用。(等待一個(gè)任務(wù)完成)
// 正常情況下 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(); //第二任務(wù)
t2.ContinueWith(t4 =>
{
//第二個(gè)任務(wù)完成了
//第三個(gè)任務(wù)對(duì)象
t3.Start();
t3.ContinueWith(t5 =>
{
Console.WriteLine("保證第三個(gè)任務(wù)完成");
});
});
});注意:在使用 Task 類時(shí),應(yīng)始終考慮處理異常和取消操作。這可以通過使用 try-catch 語句和 CancellationToken 來實(shí)現(xiàn)。
到此這篇關(guān)于C#中Task異步的常用方法的文章就介紹到這了,更多相關(guān)C# Task異步用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用iText獲取PDF的trailer數(shù)據(jù)的代碼示例
開發(fā)程序debug的時(shí)候,看到了PDF有個(gè)trailer數(shù)據(jù),挺有意思,于是考慮用代碼把它讀出來,那么就用到我們常用的iText框架了,所以本文將詳細(xì)介紹C#使用iText獲取PDF的trailer數(shù)據(jù)的方法步驟,需要的朋友可以參考下2025-09-09
C#實(shí)現(xiàn)計(jì)算年齡的簡(jiǎn)單方法匯總
本文給大家分享的是C#代碼實(shí)現(xiàn)的簡(jiǎn)單實(shí)用的給出用戶的出生日期,計(jì)算出用戶的年齡的代碼,另外附上其他網(wǎng)友的方法,算是對(duì)計(jì)算年齡的一次小結(jié),希望大家能夠喜歡。2015-05-05

