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}開始運(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)至少等待了一個任務(wù)的完成。這里https://www.baidu.com/先下載完,就直接終止等待 。

到此這篇關(guān)于C#中Task.WhenAll和Task.WhenAny方法的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c#遠(yuǎn)程html數(shù)據(jù)抓取實(shí)例分享
這篇文章主要介紹了c#遠(yuǎn)程html數(shù)據(jù)抓取的方法,大家參考使用吧2013-12-12

