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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM