Task.WaitAll chặn (block) luồng hiện tại cho đến khi tất cả các task khác hoàn thành thực thi. Phương thức Task.WhenAll tạo ra một task sẽ hoàn thành nếu và chỉ nếu tất cả các task khác đã hoàn thành.
Nếu dùng Task.WhenAll, ta nhận được task object chưa hoàn thành. Tuy nhiên, nó không chặn mà cho phép chương trình tiếp tục thực thi. Ngược lại, Task.WaitAll thực sự chặn và đợi tất cả task khác hoàn thành.
Ví dụ: có task thực hiện hoạt động với UI thread (hiển thị animation). Nếu dùng Task.WaitAll, UI sẽ bị chặn và không cập nhật cho đến khi tất cả task liên quan hoàn thành. Nếu dùng Task.WhenAll, UI thread không bị chặn và cập nhật như bình thường.
Ví dụ 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("Đang chờ task hoàn thành.");
Task.WhenAll(task1, task2);
Console.WriteLine("Các Task đã hoàn thành.");
Console.ReadLine();
}
}
}
Kết quả
Đang chờ task hoàn thành. Các Task đã hoàn thành. 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
Khi dùng Task.WhenAll, "Các Task đã hoàn thành" in ra trước khi các task khác xong. Điều này có nghĩa Task.WhenAll không chặn thực thi.
Ví dụ 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("Đang chờ task hoàn thành.");
Task.WaitAll(task1, task2);
Console.WriteLine("Các Task đã hoàn thành.");
Console.ReadLine();
}
}
}
Kết quả
Đang chờ task hoàn thành. 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 Các Task đã hoàn thành.
Khi dùng Task.WaitAll, "Các Task đã hoàn thành" chỉ in ra sau khi tất cả task khác xong. Điều này có nghĩa Task.WaitAll chặn thực thi.