Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

จะรันงาน async หลายงานและรอให้งานทั้งหมดเสร็จใน C # ได้อย่างไร


Task.WaitAll บล็อกเธรดปัจจุบันจนกว่างานอื่น ๆ ทั้งหมดจะเสร็จสิ้น

Task.WhenAll เมธอดใช้เพื่อสร้างงานที่จะเสร็จสมบูรณ์ก็ต่อเมื่องานอื่น ๆ ทั้งหมดเสร็จสิ้น ในตัวอย่างที่ 1 เราจะเห็นว่าเมื่อใช้ Task.WhenAll งานเสร็จสมบูรณ์ก่อนอื่นงานจะเสร็จสมบูรณ์ ซึ่งหมายความว่า Task.WhenAll ไม่ได้บล็อกการดำเนินการ และในตัวอย่างที่ 2 เราจะเห็นว่าเมื่อใช้ Task.WaitAll งานเสร็จสมบูรณ์จะถูกดำเนินการหลังจากงานอื่น ๆ ทั้งหมดเสร็จสิ้นเท่านั้น ซึ่งหมายความว่า Task.WaitAll จะบล็อกการดำเนินการ

ตัวอย่าง

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();
}

ผลลัพธ์

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

ตัวอย่าง

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();
}

ผลลัพธ์

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