C#中的Task.WhenAll和Task.WhenAny方法介紹
一、簡介
Task.WhenAll()、Task.WhenAny()這兩個(gè)與Task.WaitALL()、Task.WaitAny()是有區(qū)別的,When是異步的,Wait是同步的。
Task.WhenAll():所有提供的任務(wù)已完成時(shí),創(chuàng)建將完成的任務(wù)。
Task.WhenAny():任何提供的任務(wù)已完成時(shí),創(chuàng)建將完成的任務(wù)。
二、代碼案例
Task.WhenAll
代碼:
class Program { public class DownLoadTest { Stopwatch watch = new Stopwatch(); public DownLoadTest() { watch.Start(); } public string DownLoadString(string url) { Console.WriteLine(string.Format("下載{0}開始運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); WebClient wc = new WebClient(); string str = wc.DownloadString(url); Console.WriteLine(string.Format("下載{0}運(yùn)行結(jié)束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return str; } public async Task<string> DoRunStringAsync(string url) { Console.WriteLine(string.Format("異步程序獲取{0}開始運(yùn)行:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); var task = await DownLoadStringAsync(url); Console.WriteLine(string.Format("異步程序獲取{0運(yùn)行結(jié)束:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return task; } public async Task<string> DownLoadStringAsync(string url) { string str = await Task.Run(() => DownLoadString(url)); return str; } } static void Main(string[] args) { string[] urls = { "https://www.baidu.com/", "https://www.taobao.com/", "https://www.cnblogs.com/" }; var task = DoRunsAsync(urls); //task.Wait(3000); Console.WriteLine(string.Format("主線程運(yùn)行結(jié)束.")); Console.ReadKey(); } private static async Task<string> DoRunsAsync(IEnumerable<string> urls) { DownLoadTest dwtest = new DownLoadTest(); List<Task> tasks = new List<Task>(); foreach (var url in urls) { var task = dwtest.DoRunStringAsync(url); Console.WriteLine("task.Id =" + task.Id + " url=" + url); tasks.Add(task); } await Task.WhenAll(tasks); foreach (var task in tasks) { Console.WriteLine("task.Id =" + task.Id + " task.Status=" + task.Status); } return ""; } }
運(yùn)行結(jié)果:
可以看到await Task.WhenAll(tasks);異步等待了所有的任務(wù)完成。
Task.WhenAny
代碼:
class Program { public class DownLoadTest { Stopwatch watch = new Stopwatch(); public DownLoadTest() { watch.Start(); } public string DownLoadString(string url) { Console.WriteLine(string.Format("下載{0}開始運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); WebClient wc = new WebClient(); string str = wc.DownloadString(url); Console.WriteLine(string.Format("下載{0}運(yùn)行結(jié)束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return str; } public async Task<string> DoRunStringAsync(string url) { Console.WriteLine(string.Format("異步程序獲取{0}開始運(yùn)行:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); var task = await DownLoadStringAsync(url); Console.WriteLine(string.Format("異步程序獲取{0運(yùn)行結(jié)束:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return task; } public async Task<string> DownLoadStringAsync(string url) { string str = await Task.Run(() => DownLoadString(url)); return str; } } static void Main(string[] args) { string[] urls = { "https://www.baidu.com/", "https://www.taobao.com/", "https://www.cnblogs.com/" }; var task = DoRunsAsync(urls); task.Wait(1000); Console.WriteLine(string.Format("主線程運(yùn)行結(jié)束.")); Console.ReadKey(); } private static async Task<string> DoRunsAsync(IEnumerable<string> urls) { DownLoadTest dwtest = new DownLoadTest(); List<Task> tasks = new List<Task>(); foreach (var url in urls) { var task = dwtest.DoRunStringAsync(url); Console.WriteLine("task.Id =" + task.Id + " url=" + url); tasks.Add(task); } await Task.WhenAny(tasks); foreach (var task in tasks) { Console.WriteLine("task.Id =" + task.Id + " task.Status=" + task.Status); } return ""; } }
運(yùn)行結(jié)果:
Task.WhenAny(tasks)至少等待了一個(gè)任務(wù)的完成。這里https://www.baidu.com/先下載完,就直接終止等待 。
到此這篇關(guān)于C#中Task.WhenAll和Task.WhenAny方法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#基礎(chǔ)知識(shí)之字符串和正則表達(dá)式
目前為止許多編程語言和工具都包含對(duì)正則表達(dá)式的支持,C#也不例外,下面這篇文章主要給大家介紹了關(guān)于C#基礎(chǔ)知識(shí)之字符串和正則表達(dá)式的相關(guān)資料,需要的朋友可以參考下2022-10-10C#實(shí)現(xiàn)多線程的同步方法實(shí)例分析
這篇文章主要介紹了C#實(shí)現(xiàn)多線程的同步方法,實(shí)例分析了C#線程同步的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04Unity實(shí)現(xiàn)顏色漸變滑動(dòng)條
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)顏色漸變滑動(dòng)條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07C#如何使用Bogus創(chuàng)建模擬數(shù)據(jù)示例代碼
這篇文章主要給大家介紹了關(guān)于C#如何使用Bogus創(chuàng)建模擬數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04C#中通過反射將枚舉元素加載到ComboBo的實(shí)現(xiàn)方法
本文主要介紹了C#中通過反射將枚舉元素加載到ComboBo的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09C#傳值方式實(shí)現(xiàn)不同程序窗體間通信實(shí)例
Form2構(gòu)造函數(shù)中接收一個(gè)string類型參數(shù),即Form1中選中行的文本,將Form2的TextBox控件的Text設(shè)置為該string,即完成了Form1向Form2的傳值2013-12-12C#使用oledb導(dǎo)出數(shù)據(jù)到excel的方法
這篇文章主要介紹了C#使用oledb導(dǎo)出數(shù)據(jù)到excel的方法,結(jié)合實(shí)例形式分析了C#操作oledb導(dǎo)出數(shù)據(jù)的相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下2016-06-06C#實(shí)現(xiàn)將商品金額小寫轉(zhuǎn)換成大寫的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將商品金額小寫轉(zhuǎn)換成大寫的方法,涉及C#數(shù)組與字符串的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08