最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.Net 中WhenAll的解釋和用法小結

 更新時間:2024年04月15日 09:37:15   作者:微微的豬食小窩  
在.NET中,WhenAll 是一個與異步編程相關的擴展方法,它屬于 System.Threading.Tasks 命名空間下的 TaskExtensions 類,本文介紹.Net 中WhenAll的解釋和用法,感興趣的朋友跟隨小編一起看看吧

在.NET中,WhenAll 是一個與異步編程相關的擴展方法,它屬于 System.Threading.Tasks 命名空間下的 TaskExtensions 類。這個方法主要用于處理一組 Task 對象,并等待它們全部完成。當所有任務都完成時,WhenAll 將返回一個包含所有任務結果的 Task<Task[]> 對象。

解釋

WhenAll 方法用于并行執(zhí)行多個異步任務,并等待它們全部完成。這有助于簡化異步編程模型,特別是當你有多個獨立的任務需要并行執(zhí)行,并且你希望等待它們全部完成后再繼續(xù)執(zhí)行后續(xù)代碼時。

用法

下面是一個使用 WhenAll 的簡單示例

using System;
using System.Threading.Tasks;
class Program
{
    static async Task Main(string[] args)
    {
        // 創(chuàng)建三個異步任務
        Task task1 = Task.Run(() => DoSomethingAsync("Task 1"));
        Task task2 = Task.Run(() => DoSomethingAsync("Task 2"));
        Task task3 = Task.Run(() => DoSomethingAsync("Task 3"));
        // 使用 WhenAll 等待所有任務完成
        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); // 模擬耗時操作
        Console.WriteLine($"Completed {taskName}.");
    }
}

在上面的示例中,我們創(chuàng)建了三個異步任務 task1、task2 和 task3,每個任務都調用 DoSomethingAsync 方法來模擬一些異步操作。然后,我們使用 Task.WhenAll(tasks) 來等待所有任務完成。當所有任務都完成時,程序將輸出 "All tasks are completed."。

注意,WhenAll 不會返回任何任務的結果。如果你需要訪問每個任務的結果,你可以使用 Task.WhenAll 的一個重載版本,它返回一個 Task<TResult[]> 對象,其中 TResult 是任務返回值的類型。例如,如果每個任務都返回一個 int 值,那么 Task.WhenAll 將返回一個 Task<int[]> 對象。

注意事項

WhenAll 不會取消任何任務。如果你需要取消一組任務,你需要單獨處理每個任務的取消邏輯。
如果其中一個任務拋出異常,WhenAll 會等待所有其他任務完成,然后拋出一個 AggregateException,其中包含所有任務的異常。這意味著即使有任務失敗,WhenAll 也會繼續(xù)等待其他任務完成。
WhenAll 返回一個任務,你可以使用 await 關鍵字等待它完成。在等待期間,不會阻塞調用線程,這有助于提高應用程序的響應性和性能。

擴展:WaitAll 和 WhenAll 的使用及區(qū)別

用過.net 異步編程的同學都知道,比以前的多線程編程實現(xiàn)起來真的方便很多,今天把WaitAll和WhenAll這兩種編程方式回顧總結一下(當然WaitAny、WhenAny是一樣的操作)

1:WaitAll

這個方法在我理解看來,主要是為了解決多個不太相關的操作同步執(zhí)行的話,耗時較多,這個方法可以使得他們異步同時執(zhí)行,然后當所有操作都完成以后,再去進行接下來的操作,talk is cheap,show you code!

舉個例子:

var response1 = new PriceDataResponse();
                var response2 = new PriceDataResponse();
                //定義兩個異步任務 task1,task2
                Task task1 = Task.Factory.StartNew(() =>
                {
                    response1 = SampleFunc(1);
                });
                Task task2 = Task.Factory.StartNew(() =>
                {
                        response2 =  SampleFunc(2);
                });
                //等待兩個任務執(zhí)行完成(同時執(zhí)行)
                Task.WaitAll(task1, task2);
                //執(zhí)行完以后,再進行以下操作
                if (response1.Prices.Any())
                {
                    return response1;
                }
                if (response2.Prices.Any())
                {
                    return response2;
                }

也就是說,task1 和  task2 兩個任務在定義之后就已經馬不停蹄的在子線程中運行了,Task.WaitAll 是一個等待的過程,參數(shù)就是Task參數(shù),一旦全部執(zhí)行完畢了,就繼續(xù)往下執(zhí)行,這里是阻塞的,還是比較好理解的。

這樣的話WaitAny就很好理解了,就是參數(shù)里面的Task 有任意一個執(zhí)行完成,就繼續(xù)執(zhí)行后面的邏輯

2:WhenAll

WhenAll其實跟WaitAll是為了實現(xiàn)一樣的功能,只是在WaitAll基礎上又做了一層包裝,看代碼就明白了

var response1 = new PriceDataResponse();
                var response2 = new PriceDataResponse();
                //定義兩個異步任務 task1,task2
                Task task1 = Task.Factory.StartNew(() =>
                {
                    response1 = SampleFunc(1);
                });
                Task task2 = Task.Factory.StartNew(() =>
                {
                    response2 = SampleFunc(2);
                });
                //等待兩個任務執(zhí)行完成(同時執(zhí)行)
                Task.WhenAll(task1, task2).ContinueWith(p =>
                {
                    if (response1.Prices.Any())
                    {
                        return response1;
                    }
                    if (response2.Prices.Any())
                    {
                        return response2;
                    }
                    return null;
                }, TaskContinuationOptions.OnlyOnRanToCompletion);

功能上與WaitAll 是一樣,意思就是在兩個異步結束了以后,再繼續(xù)做 ContinueWith 里面的處理這里的 p 相當于是Task,如果前面定義的Task有返回值,那么這里可以用p.Result來取值

WhenAny 是一樣的,任意一個完成就執(zhí)行后面代碼

到此這篇關于.Net 中WhenAll的解釋和用法的文章就介紹到這了,更多相關.Net WhenAll用法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

五寨县| 新巴尔虎右旗| 湘潭县| 屏山县| 邳州市| 神池县| 石狮市| 彝良县| 吉安市| 治多县| 治多县| 辽宁省| 布拖县| 大同市| 岳阳市| 张掖市| 应城市| 额尔古纳市| 青川县| 天峻县| 油尖旺区| 陵川县| 晋州市| 溧阳市| 滨海县| 金阳县| 凤山县| 都兰县| 黄石市| 洛扎县| 贵南县| 河津市| 吴堡县| 五莲县| 凉山| 修水县| 彩票| 双流县| 辽宁省| 郴州市| 平度市|