C#中的Task.WaitAll和Task.WaitAny方法介紹
一、簡介
Task.WaitAll:等待所有提供的 Task 對象完成執(zhí)行過程。
Task.WaitAny:等待提供的任一 Task 對象完成執(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}的運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return; } Console.WriteLine(string.Format("下載{0}開始運行 :{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}的運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return; } } if (task.IsCompleted) Console.WriteLine(string.Format("下載{0}運行結(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時間取消運行 Console.WriteLine(task1.Status); Console.WriteLine(task2.Status); Console.WriteLine(task3.Status); Console.WriteLine(string.Format("主線程運行結(jié)束")); Console.ReadKey(); } }
運行結(jié)果:
通過運行結(jié)果可以看出,可以看到Task.WaitAll(tasks)在等待超時的時間內(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}的運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return; } Console.WriteLine(string.Format("下載{0}開始運行 :{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}的運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return; } } if (task.IsCompleted) Console.WriteLine(string.Format("下載{0}運行結(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時間取消運行 Console.WriteLine(task1.Status); Console.WriteLine(task2.Status); Console.WriteLine(task3.Status); Console.WriteLine(string.Format("主線程運行結(jié)束")); Console.ReadKey(); } }
運行結(jié)果:
通過運行結(jié)果截圖可以看出,可以看到,Task.WhenAny(tasks)至少等待了一個任務(wù)的完成。這里https://www.baidu.com/先下載完,就直接終止等待 。
三、總結(jié)
Task.WaitAll阻止當前線程,直到所有其他任務(wù)完成執(zhí)行為止。Task.WaitAny阻止當前線程,至少等待一個任務(wù)完成執(zhí)行為止。如果等待時長設(shè)置較長,上述案例結(jié)果會一樣。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#基于QRCode實現(xiàn)動態(tài)生成自定義二維碼圖片功能示例
這篇文章主要介紹了C#基于QRCode實現(xiàn)動態(tài)生成自定義二維碼圖片功能,結(jié)合實例形式分析了C#使用QRCode動態(tài)生成二維碼圖片相關(guān)操作技巧,需要的朋友可以參考下2019-02-02關(guān)于Unity中RectTransform與transform的區(qū)別
這篇文章主要介紹了Unity中RectTransform與transform的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01c#操作sqlserver數(shù)據(jù)庫的簡單示例
這篇文章主要介紹了c#操作sqlserver數(shù)據(jù)庫的簡單示例,需要的朋友可以參考下2014-04-04