Computer >> Máy Tính >  >> Lập trình >> C#

Sự khác biệt giữa Task.WhenAll () và Task.WaitAll () trong C # là gì?

Task.WaitAll chặn luồng hiện tại cho đến khi tất cả các tác vụ khác đã hoàn thành việc thực thi. Phương thức Task.WhenAll được sử dụng để tạo một tác vụ sẽ hoàn thành nếu và chỉ khi tất cả các tác vụ khác đã hoàn thành.

Nếu chúng ta đang sử dụng Task.WhenAll, chúng ta sẽ nhận được một đối tượng task chưa hoàn thành. Tuy nhiên, nó sẽ không chặn mà cho phép chương trình thực thi. Ngược lại, lệnh gọi phương thứcTask.WaitAll thực sự chặn và đợi tất cả các tác vụ khác hoàn thành.

Để hiểu với một ví dụ, chúng ta hãy nói rằng chúng ta có một nhiệm vụ thực hiện một số hoạt động với chuỗi giao diện người dùng, nói rằng một số hoạt ảnh cần được hiển thị trong giao diện người dùng. Bây giờ, nếu chúng ta sử dụng Task.WaitAll, giao diện người dùng sẽ bị chặn và sẽ không được cập nhật cho đến khi tất cả các tác vụ liên quan được hoàn thành và khối được giải phóng. Tuy nhiên, nếu chúng ta đang sử dụng Task.WhenAll trong cùng một ứng dụng, chuỗi giao diện người dùng sẽ không bị chặn và sẽ được cập nhật như bình thường.

Ví dụ cho Task.WhenAll -

Ví dụ

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("Waiting for tasks to complete.");
         Task.WhenAll(task1, task2);
         Console.WriteLine("Tasks Completed.");
         Console.ReadLine();
      }
   }
}

Đầu ra

Đầu ra của đoạn mã trên là

Waiting for tasks to complete.
Tasks Completed.
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

Trong ví dụ trên, chúng ta có thể thấy rằng khi sử dụng Task. Điều này có nghĩa là Task.WhenAlldoes không chặn việc thực thi.

Ví dụ cho Task.WaitAll -

Ví dụ

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("Waiting for tasks to complete.");
         Task.WaitAll(task1, task2);
         Console.WriteLine("Tasks Completed.");
         Console.ReadLine();
      }
   }
}

Đầu ra

Đầu ra của đoạn mã trên là

Waiting for tasks to complete.
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
Tasks Completed.

Trong ví dụ trên, chúng ta có thể thấy rằng khi sử dụng Task.WaitAll tác vụ hoàn thành chỉ được thực thi sau khi tất cả các tác vụ khác được hoàn thành. Điều này có nghĩa là Task.WaitAllblock thực thi.