C#中的Task.WhenAll()和Task.WaitAll()有什麼區別
阿新 • • 發佈:2021-06-21
轉自https://www.nhooo.com/note/qa02fb.html
Task.WaitAll阻止當前執行緒,直到所有其他任務完成執行為止。Task.WhenAll方法用於建立僅當所有其他任務均已完成時才完成的任務。
如果我們使用Task.WhenAll,我們將得到一個未完成的任務物件。但是,它不會阻塞,但會允許程式執行。相反,Task.WaitAll方法呼叫實際上會阻塞並等待所有其他任務完成。
為了舉例說明,讓我們說我們有一個任務,它使用UI執行緒執行一些活動,例如需要在使用者介面中顯示一些動畫。現在,如果我們使用Task.WaitAll,則在所有相關任務完成並釋放該塊之前,該使用者介面將被阻止並且不會更新。但是,如果我們在同一應用程式中使用Task.WhenAll,則不會阻塞UI執行緒,而是會照常更新。
Task.WhenAll的示例-
示例
using System; using System.Threading.Tasks; namespace DemoApplication{ public class Program{ static void Main(string[] args){ Task task1 = new Task(() =>{ for (int i = 0; i < 5; i++){ Console.WriteLine("Task 1 - iteration {0}", i); Task.Delay(1000); } Console.WriteLine("Task 1 complete"); }); Task task2 = new Task(() =>{ Console.WriteLine("Task 2 complete"); }); task1.Start(); task2.Start(); Console.WriteLine("等待任務完成。"); Task.WhenAll(task1, task2); Console.WriteLine("任務完成。"); Console.ReadLine(); } } }
輸出結果
上面程式碼的輸出是
等待任務完成。 任務完成。 Task 1 - iteration 0 Task 2 complete Task 1 - iteration 1 Task 1 - iteration 2 Task 1 - iteration 3 Task 1 - iteration 4 Task 1 complete
在上面的示例中,我們可以看到在使用Task.WhenAll時,在其他任務完成之前執行了complete任務。這意味著Task.WhenAll不會阻止執行。
Task.WaitAll的示例-
示例
using System; using System.Threading.Tasks; namespace DemoApplication{ public class Program{ static void Main(string[] args){ Task task1 = new Task(() =>{ for (int i = 0; i < 5; i++){ Console.WriteLine("Task 1 - iteration {0}", i); Task.Delay(1000); } Console.WriteLine("Task 1 complete"); }); Task task2 = new Task(() =>{ Console.WriteLine("Task 2 complete"); }); task1.Start(); task2.Start(); Console.WriteLine("等待任務完成。"); Task.WaitAll(task1, task2); Console.WriteLine("任務完成。"); Console.ReadLine(); } } }
輸出結果
上面程式碼的輸出是
等待任務完成。 Task 1 - iteration 0 Task 2 complete Task 1 - iteration 1 Task 1 - iteration 2 Task 1 - iteration 3 Task 1 - iteration 4 Task 1 complete 任務完成。
在上面的示例中,我們可以看到,使用Task.WaitAll時,僅在所有其他任務完成後才執行完成任務。這意味著Task.WaitAll阻止執行。