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

Làm thế nào để chạy nhiều tác vụ không đồng bộ và đợi tất cả chúng hoàn thành trong C #?

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 tất quá trình thực thi.

Task.WhenAll được sử dụng để tạo một nhiệm vụ sẽ hoàn thành nếu và chỉ khi tất cả các nhiệm vụ khác đã hoàn thành. Trong ví dụ đầu tiên, chúng ta có thể thấy rằng khi sử dụng Task.WhenAll tác vụ hoàn thành được thực thi trước khi các tác vụ khác được hoàn thành. Điều này có nghĩa là Task.WhenAll không chặn việc thực thi. Và trong ví dụ thứ 2, chúng ta có thể thấy rằng khi sử dụng Task.WaitAll, tất cả các 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.WaitAll chặn việc thực thi.

Ví dụ

static void Main(string[] args){
   Task task1 = new Task(() =>{
      for (var i = 0; i < 5; i++){
         Console.WriteLine("Task 1 - iteration {0}", i);
         Task.Delay(1000);
      }
      Console.WriteLine("Task 1 complete");
   });
   Task task2 = new Task(() =>{
      for (var i = 0; i < 5; i++){
         Console.WriteLine("Task 2 - iteration {0}", i);
         Task.Delay(1000);
      }
      Console.WriteLine("Task 2 complete");
   });
   task1.Start();
   task2.Start();
   Console.WriteLine("Waiting for tasks to complete.");
   Task.WhenAll(task1, task2);
   Console.WriteLine("Both Tasks Completed.");
   Console.ReadLine();
}

Đầu ra

Waiting for tasks to complete.
Both Tasks Completed.
Task 1 - iteration 0
Task 2 - iteration 0
Task 2 - iteration 1
Task 2 - iteration 2
Task 2 - iteration 3
Task 1 - iteration 1
Task 1 - iteration 2
Task 1 - iteration 3
Task 1 - iteration 4
Task 1 complete
Task 2 - iteration 4
Task 2 complete

Ví dụ

static void Main(string[] args){
   Task task1 = new Task(() =>{
      for (var i = 0; i < 5; i++){
         Console.WriteLine("Task 1 - iteration {0}", i);
         Task.Delay(1000);
      }
      Console.WriteLine("Task 1 complete");
   });
   Task task2 = new Task(() =>{
      for (var i = 0; i < 5; i++){
         Console.WriteLine("Task 2 - iteration {0}", i);
         Task.Delay(1000);
      }
      Console.WriteLine("Task 2 complete");
   });
   task1.Start();
   task2.Start();
   Console.WriteLine("Waiting for tasks to complete.");
   Task.WaitAll(task1, task2);
   Console.WriteLine("Both Tasks Completed.");
   Console.ReadLine();
}

Đầu ra

Waiting for tasks to complete.
Task 1 - iteration 0
Task 2 - iteration 0
Task 1 - iteration 1
Task 1 - iteration 2
Task 1 - iteration 3
Task 1 - iteration 4
Task 1 complete
Task 2 - iteration 1
Task 2 - iteration 2
Task 2 - iteration 3
Task 2 - iteration 4
Task 2 complete
Both Tasks Completed