1. 程式人生 > 其它 >C#中的Task.WhenAll()和Task.WaitAll()有什麼區別

C#中的Task.WhenAll()和Task.WaitAll()有什麼區別

轉自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阻止執行。