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 不知道誰(shuí)先執(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 語(yǔ)句和 CancellationToken 來實(shí)現(xiàn)。
到此這篇關(guān)于C#中Task異步的常用方法的文章就介紹到這了,更多相關(guān)C# Task異步用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用async和await實(shí)現(xiàn)異步編程
本文詳細(xì)講解了C#使用async和await實(shí)現(xiàn)異步編程的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
C#實(shí)現(xiàn)動(dòng)態(tài)顯示及動(dòng)態(tài)移除圖片方法
這篇文章主要介紹了C#實(shí)現(xiàn)動(dòng)態(tài)顯示及動(dòng)態(tài)移除圖片方法,對(duì)于C#的初學(xué)者了解圖像操作有一定的幫助,需要的朋友可以參考下2014-07-07
C#在Winform開發(fā)中使用Grid++報(bào)表
這篇文章主要介紹了C#在Winform開發(fā)中使用Grid++報(bào)表,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
C#的正則表達(dá)式Regex類使用簡(jiǎn)明教程
這篇文章主要介紹了C#的正則表達(dá)式Regex類使用簡(jiǎn)明教程,分別講解了如何匹配、如何獲取匹配次數(shù)、如何獲取匹配內(nèi)容及捕獲的方法,需要的朋友可以參考下2014-08-08
Winform實(shí)現(xiàn)調(diào)用asp.net數(shù)據(jù)接口實(shí)例
這篇文章主要介紹了Winform實(shí)現(xiàn)調(diào)用asp.net數(shù)據(jù)接口的方法,以實(shí)例的形式講述了數(shù)據(jù)接口及反射辨別響應(yīng)的實(shí)現(xiàn)方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10
基于C#實(shí)現(xiàn)語(yǔ)音預(yù)處理
無論是在音視頻錄制系統(tǒng),還是音視頻通話系統(tǒng)或視頻會(huì)議系統(tǒng)中,對(duì)從麥克風(fēng)采集到的說話的聲音數(shù)據(jù)進(jìn)行預(yù)處理,都是是非常必要的,下面就跟隨小編一起來學(xué)習(xí)一下如何使用C#實(shí)現(xiàn)語(yǔ)音預(yù)處理吧2025-06-06

