C#中的Task.WaitAll和Task.WaitAny方法介紹
一、簡(jiǎn)介
Task.WaitAll:等待所有提供的 Task 對(duì)象完成執(zhí)行過程。
Task.WaitAny:等待提供的任一 Task 對(duì)象完成執(zhí)行過程。
二、代碼案例
Task.WaitAll
代碼:
class Program
{
public class DownLoadTest
{
Stopwatch watch = new Stopwatch();
public DownLoadTest()
{
watch.Start();
}
public async Task DoRunTaskAsync(string url, CancellationToken ct)
{
if (ct.IsCancellationRequested)
{
Console.WriteLine(string.Format("取消{0}的運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
return;
}
Console.WriteLine(string.Format("下載{0}開始運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
WebClient wc = new WebClient();
await Task.Run(() =>
{
var task = wc.DownloadStringTaskAsync(url);
while (!task.IsCompleted)
{
if (ct.IsCancellationRequested)
{
Console.WriteLine(string.Format("取消{0}的運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
return;
}
}
if (task.IsCompleted)
Console.WriteLine(string.Format("下載{0}運(yùn)行結(jié)束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
});
}
}
static void Main(string[] args)
{
DownLoadTest dwtest = new DownLoadTest();
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
var task1 = dwtest.DoRunTaskAsync("https://www.baidu.com/", token);
var task2 = dwtest.DoRunTaskAsync("https://www.taobao.com/", token);
var task3 = dwtest.DoRunTaskAsync("https://www.cnblogs.com/", token);
Task[] tasks = new Task[] { task1, task2, task3 };
Console.WriteLine("task.Result等待結(jié)果打印");
Task.WaitAll(tasks, 10000);
cts.Cancel();//超過10s時(shí)間取消運(yùn)行
Console.WriteLine(task1.Status);
Console.WriteLine(task2.Status);
Console.WriteLine(task3.Status);
Console.WriteLine(string.Format("主線程運(yùn)行結(jié)束"));
Console.ReadKey();
}
}運(yùn)行結(jié)果:
通過運(yùn)行結(jié)果可以看出,可以看到Task.WaitAll(tasks)在等待超時(shí)的時(shí)間內(nèi),同步等待了所有的任務(wù)完成。

Task.WaitAny
代碼:
class Program
{
public class DownLoadTest
{
Stopwatch watch = new Stopwatch();
public DownLoadTest()
{
watch.Start();
}
public async Task DoRunTaskAsync(string url, CancellationToken ct)
{
if (ct.IsCancellationRequested)
{
Console.WriteLine(string.Format("取消{0}的運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
return;
}
Console.WriteLine(string.Format("下載{0}開始運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
WebClient wc = new WebClient();
await Task.Run(() =>
{
var task = wc.DownloadStringTaskAsync(url);
while (!task.IsCompleted)
{
if (ct.IsCancellationRequested)
{
Console.WriteLine(string.Format("取消{0}的運(yùn)行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
return;
}
}
if (task.IsCompleted)
Console.WriteLine(string.Format("下載{0}運(yùn)行結(jié)束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
});
}
}
static void Main(string[] args)
{
DownLoadTest dwtest = new DownLoadTest();
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
var task1 = dwtest.DoRunTaskAsync("https://www.baidu.com/", token);
var task2 = dwtest.DoRunTaskAsync("https://www.taobao.com/", token);
var task3 = dwtest.DoRunTaskAsync("https://www.cnblogs.com/", token);
Task[] tasks = new Task[] { task1, task2, task3 };
Console.WriteLine("task.Result等待結(jié)果打印");
Task.WaitAny(tasks, 4000);
cts.Cancel();//超過4s時(shí)間取消運(yùn)行
Console.WriteLine(task1.Status);
Console.WriteLine(task2.Status);
Console.WriteLine(task3.Status);
Console.WriteLine(string.Format("主線程運(yùn)行結(jié)束"));
Console.ReadKey();
}
}運(yùn)行結(jié)果:
通過運(yùn)行結(jié)果截圖可以看出,可以看到,Task.WhenAny(tasks)至少等待了一個(gè)任務(wù)的完成。這里https://www.baidu.com/先下載完,就直接終止等待 。

三、總結(jié)
Task.WaitAll阻止當(dāng)前線程,直到所有其他任務(wù)完成執(zhí)行為止。Task.WaitAny阻止當(dāng)前線程,至少等待一個(gè)任務(wù)完成執(zhí)行為止。如果等待時(shí)長(zhǎng)設(shè)置較長(zhǎng),上述案例結(jié)果會(huì)一樣。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity3D Shader實(shí)現(xiàn)流光效果
這篇文章主要為大家詳細(xì)介紹了Unity3D Shader實(shí)現(xiàn)流光效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C#實(shí)現(xiàn)ArrayList動(dòng)態(tài)數(shù)組的示例
ArrayList是一個(gè)動(dòng)態(tài)數(shù)組,可以用來存儲(chǔ)任意類型的元素,本文就來介紹一下C#實(shí)現(xiàn)ArrayList動(dòng)態(tài)數(shù)組的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
Unity延時(shí)執(zhí)行的多種方法小結(jié)
本文主要介紹了4種延時(shí)執(zhí)行的方法,主要包括Update計(jì)時(shí)器,Invoke,協(xié)程,DoTween,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
C#?連接本地?cái)?shù)據(jù)庫(kù)的實(shí)現(xiàn)示例
本文主要介紹了C#?連接本地?cái)?shù)據(jù)庫(kù)的實(shí)現(xiàn)示例,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
WPF實(shí)現(xiàn)繪制餅狀統(tǒng)計(jì)圖的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用WPF實(shí)現(xiàn)繪制簡(jiǎn)單的餅狀統(tǒng)計(jì)圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-10-10
C# Bitmap圖像處理(含增強(qiáng)對(duì)比度的三種方法)
本文主要介紹了C# Bitmap圖像處理(含增強(qiáng)對(duì)比度的三種方法),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Winform實(shí)現(xiàn)調(diào)用asp.net數(shù)據(jù)接口實(shí)例
這篇文章主要介紹了Winform實(shí)現(xiàn)調(diào)用asp.net數(shù)據(jù)接口的方法,以實(shí)例的形式講述了數(shù)據(jù)接口及反射辨別響應(yīng)的實(shí)現(xiàn)方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10
Unity技術(shù)手冊(cè)之Slider滑動(dòng)器使用實(shí)例詳解
這篇文章主要為大家介紹了Unity技術(shù)手冊(cè)之Slider滑動(dòng)器使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
C#?微信支付回調(diào)驗(yàn)簽處理的實(shí)現(xiàn)
在微信支付中,當(dāng)用戶支付成功后,微信會(huì)把相關(guān)支付結(jié)果和用戶信息發(fā)送給商戶,本文就詳細(xì)的介紹了C#?微信支付回調(diào)驗(yàn)簽處理,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12

