Task.WaitAll和Task.WaitAny
一、簡介
Task.WaitAll:等待所有提供的 Task 物件完成執行程序,Task.WaitAny:等待提供的任一 Task 物件完成執行程序,
二、代碼案例
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}運行結束 :{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等待結果列印"); Task.WaitAll(tasks, 10000); cts.Cancel();//超過10s時間取消運行 Console.WriteLine(task1.Status); Console.WriteLine(task2.Status); Console.WriteLine(task3.Status); Console.WriteLine(string.Format("主線程運行結束")); Console.ReadKey(); } }
運行結果:
通過運行結果可以看出,可以看到Task.WaitAll(tasks)在等待超時的時間內,同步等待了所有的任務完成,

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}運行結束 :{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等待結果列印"); Task.WaitAny(tasks, 4000); cts.Cancel();//超過4s時間取消運行 Console.WriteLine(task1.Status); Console.WriteLine(task2.Status); Console.WriteLine(task3.Status); Console.WriteLine(string.Format("主線程運行結束")); Console.ReadKey(); } }
運行結果:
通過運行結果截圖可以看出,可以看到,Task.WhenAny(tasks)至少等待了一個任務的完成,這里https://www.baidu.com/先下載完,就直接終止等待 ,

三、總結
Task.WaitAll阻止當前執行緒,直到所有其他任務完成執行為止,Task.WaitAny阻止當前執行緒,至少等待一個任務完成執行為止,如果等待時長設定較長,上述案例結果會一樣,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/285388.html
標籤:.NET技术
