.Net 中WhenAll的解釋和用法小結(jié)
在.NET中,WhenAll 是一個(gè)與異步編程相關(guān)的擴(kuò)展方法,它屬于 System.Threading.Tasks 命名空間下的 TaskExtensions 類。這個(gè)方法主要用于處理一組 Task 對(duì)象,并等待它們?nèi)客瓿伞.?dāng)所有任務(wù)都完成時(shí),WhenAll 將返回一個(gè)包含所有任務(wù)結(jié)果的 Task<Task[]> 對(duì)象。
解釋
WhenAll 方法用于并行執(zhí)行多個(gè)異步任務(wù),并等待它們?nèi)客瓿?。這有助于簡(jiǎn)化異步編程模型,特別是當(dāng)你有多個(gè)獨(dú)立的任務(wù)需要并行執(zhí)行,并且你希望等待它們?nèi)客瓿珊笤倮^續(xù)執(zhí)行后續(xù)代碼時(shí)。
用法
下面是一個(gè)使用 WhenAll 的簡(jiǎn)單示例:
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// 創(chuàng)建三個(gè)異步任務(wù)
Task task1 = Task.Run(() => DoSomethingAsync("Task 1"));
Task task2 = Task.Run(() => DoSomethingAsync("Task 2"));
Task task3 = Task.Run(() => DoSomethingAsync("Task 3"));
// 使用 WhenAll 等待所有任務(wù)完成
Task[] tasks = { task1, task2, task3 };
await Task.WhenAll(tasks);
Console.WriteLine("All tasks are completed.");
}
static async Task DoSomethingAsync(string taskName)
{
Console.WriteLine($"Starting {taskName}...");
await Task.Delay(1000); // 模擬耗時(shí)操作
Console.WriteLine($"Completed {taskName}.");
}
}在上面的示例中,我們創(chuàng)建了三個(gè)異步任務(wù) task1、task2 和 task3,每個(gè)任務(wù)都調(diào)用 DoSomethingAsync 方法來(lái)模擬一些異步操作。然后,我們使用 Task.WhenAll(tasks) 來(lái)等待所有任務(wù)完成。當(dāng)所有任務(wù)都完成時(shí),程序?qū)⑤敵?"All tasks are completed."。
注意,WhenAll 不會(huì)返回任何任務(wù)的結(jié)果。如果你需要訪問(wèn)每個(gè)任務(wù)的結(jié)果,你可以使用 Task.WhenAll 的一個(gè)重載版本,它返回一個(gè) Task<TResult[]> 對(duì)象,其中 TResult 是任務(wù)返回值的類型。例如,如果每個(gè)任務(wù)都返回一個(gè) int 值,那么 Task.WhenAll 將返回一個(gè) Task<int[]> 對(duì)象。
注意事項(xiàng)
WhenAll 不會(huì)取消任何任務(wù)。如果你需要取消一組任務(wù),你需要單獨(dú)處理每個(gè)任務(wù)的取消邏輯。
如果其中一個(gè)任務(wù)拋出異常,WhenAll 會(huì)等待所有其他任務(wù)完成,然后拋出一個(gè) AggregateException,其中包含所有任務(wù)的異常。這意味著即使有任務(wù)失敗,WhenAll 也會(huì)繼續(xù)等待其他任務(wù)完成。
WhenAll 返回一個(gè)任務(wù),你可以使用 await 關(guān)鍵字等待它完成。在等待期間,不會(huì)阻塞調(diào)用線程,這有助于提高應(yīng)用程序的響應(yīng)性和性能。
擴(kuò)展:WaitAll 和 WhenAll 的使用及區(qū)別
用過(guò).net 異步編程的同學(xué)都知道,比以前的多線程編程實(shí)現(xiàn)起來(lái)真的方便很多,今天把WaitAll和WhenAll這兩種編程方式回顧總結(jié)一下(當(dāng)然WaitAny、WhenAny是一樣的操作)
1:WaitAll
這個(gè)方法在我理解看來(lái),主要是為了解決多個(gè)不太相關(guān)的操作同步執(zhí)行的話,耗時(shí)較多,這個(gè)方法可以使得他們異步同時(shí)執(zhí)行,然后當(dāng)所有操作都完成以后,再去進(jìn)行接下來(lái)的操作,talk is cheap,show you code!
舉個(gè)例子:
var response1 = new PriceDataResponse();
var response2 = new PriceDataResponse();
//定義兩個(gè)異步任務(wù) task1,task2
Task task1 = Task.Factory.StartNew(() =>
{
response1 = SampleFunc(1);
});
Task task2 = Task.Factory.StartNew(() =>
{
response2 = SampleFunc(2);
});
//等待兩個(gè)任務(wù)執(zhí)行完成(同時(shí)執(zhí)行)
Task.WaitAll(task1, task2);
//執(zhí)行完以后,再進(jìn)行以下操作
if (response1.Prices.Any())
{
return response1;
}
if (response2.Prices.Any())
{
return response2;
}也就是說(shuō),task1 和 task2 兩個(gè)任務(wù)在定義之后就已經(jīng)馬不停蹄的在子線程中運(yùn)行了,Task.WaitAll 是一個(gè)等待的過(guò)程,參數(shù)就是Task參數(shù),一旦全部執(zhí)行完畢了,就繼續(xù)往下執(zhí)行,這里是阻塞的,還是比較好理解的。
這樣的話WaitAny就很好理解了,就是參數(shù)里面的Task 有任意一個(gè)執(zhí)行完成,就繼續(xù)執(zhí)行后面的邏輯
2:WhenAll
WhenAll其實(shí)跟WaitAll是為了實(shí)現(xiàn)一樣的功能,只是在WaitAll基礎(chǔ)上又做了一層包裝,看代碼就明白了
var response1 = new PriceDataResponse();
var response2 = new PriceDataResponse();
//定義兩個(gè)異步任務(wù) task1,task2
Task task1 = Task.Factory.StartNew(() =>
{
response1 = SampleFunc(1);
});
Task task2 = Task.Factory.StartNew(() =>
{
response2 = SampleFunc(2);
});
//等待兩個(gè)任務(wù)執(zhí)行完成(同時(shí)執(zhí)行)
Task.WhenAll(task1, task2).ContinueWith(p =>
{
if (response1.Prices.Any())
{
return response1;
}
if (response2.Prices.Any())
{
return response2;
}
return null;
}, TaskContinuationOptions.OnlyOnRanToCompletion);功能上與WaitAll 是一樣,意思就是在兩個(gè)異步結(jié)束了以后,再繼續(xù)做 ContinueWith 里面的處理這里的 p 相當(dāng)于是Task,如果前面定義的Task有返回值,那么這里可以用p.Result來(lái)取值
WhenAny 是一樣的,任意一個(gè)完成就執(zhí)行后面代碼
到此這篇關(guān)于.Net 中WhenAll的解釋和用法的文章就介紹到這了,更多相關(guān).Net WhenAll用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
HttpRequest的QueryString屬性 的一點(diǎn)認(rèn)識(shí)
我們開(kāi)發(fā)asp.net程序獲取QueryString時(shí),經(jīng)常性的遇到一些url編碼問(wèn)題2012-11-11
asp.net配置會(huì)話狀態(tài)Session實(shí)現(xiàn)代碼
在Web應(yīng)用程序中,都會(huì)有一個(gè)Web.config文件來(lái)配置當(dāng)前Web項(xiàng)目。其中包括關(guān)于會(huì)話狀態(tài)Session的配置2012-10-10
ASP.NET MVC自定義授權(quán)過(guò)濾器
這篇文章介紹了ASP.NET MVC自定義授權(quán)過(guò)濾器的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
asp.net 數(shù)據(jù)類型轉(zhuǎn)換類代碼
asp.net 數(shù)據(jù)類型轉(zhuǎn)換類代碼,需要的朋友可以參考下2012-06-06
如何使用Microsoft.Extensions.AI簡(jiǎn)化.NET中的AI集成
Microsoft.Extensions.AI是一個(gè)創(chuàng)新的?.NET?庫(kù),它為平臺(tái)開(kāi)發(fā)人員提供了一個(gè)內(nèi)聚的?C#?抽象層,簡(jiǎn)化了與大型語(yǔ)言模型(LLMs)和嵌入等AI服務(wù)的交互,本文給大家介紹如何使用Microsoft.Extensions.AI簡(jiǎn)化.NET中的AI集成,感興趣的朋友一起看看吧2024-11-11
asp.net上傳圖片保存到數(shù)據(jù)庫(kù)的代碼
有時(shí)候某種需要將圖片保存到數(shù)據(jù)庫(kù)中,那么下面的代碼就可以參考下,下面沒(méi)有數(shù)據(jù)庫(kù)的建表說(shuō)明,但數(shù)據(jù)庫(kù)需要建立下。2010-07-07
Visual Studio 2017無(wú)法加載Visual Studio 2015創(chuàng)建的SharePoint解決方法
這篇文章主要為大家詳細(xì)介紹了Visual Studio 2017無(wú)法加載Visual Studio 2015創(chuàng)建的SharePoint的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
VS2022?.NET5一鍵發(fā)布到遠(yuǎn)程騰訊云IIS服務(wù)器的詳細(xì)步驟
這篇文章主要介紹了VS2022?.NET5一鍵發(fā)布到遠(yuǎn)程騰訊云IIS服務(wù)器,首先需要添加服務(wù)器相關(guān)功能,文中通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
asp.net?web?api2設(shè)置默認(rèn)啟動(dòng)登錄頁(yè)面的方法
這篇文章主要介紹了asp.net?web?api2設(shè)置默認(rèn)啟動(dòng)登錄頁(yè)面的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09

