Cả hai câu trả lời đều không đề cập đến sự chờ đợi Task.WhenAll
:
var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();
await Task.WhenAll(task1, task2);
Sự khác biệt chính giữa Task.WaitAll
và Task.WhenAll
là cái trước sẽ chặn (tương tự như sử dụng Wait
trên một tác vụ) trong khi cái sau sẽ không và có thể được chờ đợi, mang lại quyền điều khiển cho người gọi cho đến khi tất cả các tác vụ kết thúc.
Hơn nữa, xử lý ngoại lệ khác nhau:
Task.WaitAll
:
Ít nhất một trong số các trường hợp Nhiệm vụ đã bị hủy - hoặc một ngoại lệ đã được đưa ra trong quá trình thực thi ít nhất một trong các trường hợp Nhiệm vụ. Nếu một tác vụ đã bị hủy, AggregateException sẽ chứa một Activity HủyedException trong bộ sưu tập InternalExceptions của nó.
Task.WhenAll
:
Nếu bất kỳ tác vụ được cung cấp nào hoàn thành ở trạng thái bị lỗi, thì tác vụ được trả lại cũng sẽ hoàn thành ở trạng thái Bị lỗi, trong đó các ngoại lệ của nó sẽ chứa tập hợp các ngoại lệ không được bao bọc từ mỗi tác vụ được cung cấp.
Nếu không có tác vụ được cung cấp nào bị lỗi nhưng ít nhất một trong số chúng đã bị hủy, tác vụ được trả lại sẽ kết thúc ở trạng thái Đã hủy.
Nếu không có tác vụ nào bị lỗi và không có tác vụ nào bị hủy, tác vụ kết quả sẽ kết thúc ở trạng thái RanToCompletion. Nếu mảng / liệt kê được cung cấp không chứa tác vụ, tác vụ được trả về sẽ ngay lập tức chuyển sang trạng thái RanToCompletion trước khi nó được trả về cho người gọi.
await Task.WhenAll(task1, task2);
không?