C#中的Task.WhenAll和Task.WhenAny方法介紹
一、簡介
Task.WhenAll()、Task.WhenAny()這兩個與Task.WaitALL()、Task.WaitAny()是有區(qū)別的,When是異步的,Wait是同步的。
Task.WhenAll():所有提供的任務(wù)已完成時,創(chuàng)建將完成的任務(wù)。
Task.WhenAny():任何提供的任務(wù)已完成時,創(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}開始運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
WebClient wc = new WebClient();
string str = wc.DownloadString(url);
Console.WriteLine(string.Format("下載{0}運行結(jié)束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
return str;
}
public async Task<string> DoRunStringAsync(string url)
{
Console.WriteLine(string.Format("異步程序獲取{0}開始運行:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
var task = await DownLoadStringAsync(url);
Console.WriteLine(string.Format("異步程序獲取{0運行結(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("主線程運行結(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 "";
}
}運行結(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}開始運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
WebClient wc = new WebClient();
string str = wc.DownloadString(url);
Console.WriteLine(string.Format("下載{0}運行結(jié)束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
return str;
}
public async Task<string> DoRunStringAsync(string url)
{
Console.WriteLine(string.Format("異步程序獲取{0}開始運行:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
var task = await DownLoadStringAsync(url);
Console.WriteLine(string.Format("異步程序獲取{0運行結(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("主線程運行結(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 "";
}
}運行結(jié)果:
Task.WhenAny(tasks)至少等待了一個任務(wù)的完成。這里https://www.baidu.com/先下載完,就直接終止等待 。

到此這篇關(guān)于C#中Task.WhenAll和Task.WhenAny方法的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#如何使用Bogus創(chuàng)建模擬數(shù)據(jù)示例代碼
這篇文章主要給大家介紹了關(guān)于C#如何使用Bogus創(chuàng)建模擬數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
C#中通過反射將枚舉元素加載到ComboBo的實現(xiàn)方法
本文主要介紹了C#中通過反射將枚舉元素加載到ComboBo的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
C#使用oledb導(dǎo)出數(shù)據(jù)到excel的方法
這篇文章主要介紹了C#使用oledb導(dǎo)出數(shù)據(jù)到excel的方法,結(jié)合實例形式分析了C#操作oledb導(dǎo)出數(shù)據(jù)的相關(guān)技巧與注意事項,需要的朋友可以參考下2016-06-06
C#實現(xiàn)將商品金額小寫轉(zhuǎn)換成大寫的方法
這篇文章主要介紹了C#實現(xiàn)將商品金額小寫轉(zhuǎn)換成大寫的方法,涉及C#數(shù)組與字符串的相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-08-08

