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

อะไรคือความแตกต่างระหว่าง Task.WhenAll () และ Task.WaitAll () ใน C #


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

หากเราใช้ Task.WhenAll เราจะได้รับวัตถุงานที่ไม่สมบูรณ์ อย่างไรก็ตาม มันจะไม่บล็อก แต่จะอนุญาตให้โปรแกรมดำเนินการ ในทางกลับกัน การเรียกเมธอด theTask.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("Waiting for tasks to complete.");
         Task.WhenAll(task1, task2);
         Console.WriteLine("Tasks Completed.");
         Console.ReadLine();
      }
   }
}

ผลลัพธ์

ผลลัพธ์ของโค้ดด้านบนคือ

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

ในตัวอย่างข้างต้น เราจะเห็นว่าเมื่อใช้ Task.WhenAll งานเสร็จสมบูรณ์ก่อนอื่นงานจะเสร็จสมบูรณ์ ซึ่งหมายความว่า 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("Waiting for tasks to complete.");
         Task.WaitAll(task1, task2);
         Console.WriteLine("Tasks Completed.");
         Console.ReadLine();
      }
   }
}

ผลลัพธ์

ผลลัพธ์ของโค้ดด้านบนคือ

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.

ในตัวอย่างข้างต้น เราจะเห็นว่าเมื่อใช้ Task.WaitAll งานเสร็จสมบูรณ์จะดำเนินการหลังจากงานอื่น ๆ ทั้งหมดเสร็จสิ้นเท่านั้น ซึ่งหมายความว่า Task.WaitAllblock การดำเนินการ