Task.WaitAll 와 Task.WhenAll 차이 점과 사례를 간략하게 정리하려고 한다.
일반적으로
WaitAll() 은 Task의 모든 작업이 완료 될 때까지 현재 스레드를 블럭시키고
WhenAll() 은 스레드를 블럭시키지 않고 기다리는 동작을 나타내는 Task 객체를 반환한다
또 다른 차이점으로 예외처리가 있는데
WaitAll()이 발생 AggregateException 하는 작업 중 하나를 던져 모든 던져 예외를 검사 할 수 있으며
await는 await WhenAll() 풀고 AggregateException첫 번째 예외 만 반환 한다.
SampleCode
class SampleApp
{
public class CustomException : Exception
{
public CustomException(String message) : base(message)
{ }
}
static void WaitAndThrow(int id, int waitInMs)
{
Console.WriteLine($"{DateTime.UtcNow}: Task {id} 시작");
Thread.Sleep(waitInMs);
throw new CustomException($"Task {id} {DateTime.UtcNow}");
}
static void Main(string[] args)
{
Task.Run(async () =>
{
await MethodAsync();
}).Wait();
}
static async Task MethodAsync()
{
try
{
Task[] taskArray = { Task.Factory.StartNew(() => WaitAndThrow(1, 1000)),
Task.Factory.StartNew(() => WaitAndThrow(2, 2000)),
Task.Factory.StartNew(() => WaitAndThrow(3, 3000)) };
// Task.WaitAll(taskArray); 또는 await Task.WhenAll(taskArray);
}
catch (AggregateException ex)
{
foreach (var inner in ex.InnerExceptions)
{
Console.WriteLine($"AggregateException {DateTime.UtcNow}: " + inner.Message);
}
}
catch (Exception ex)
{
Console.WriteLine($"Exception {DateTime.UtcNow}: " + ex.Message);
}
Console.ReadLine();
}
}
output : await Task.WhenAll(taskArray)
19/11/2016 12:18:37 AM: Task 1 started
19/11/2016 12:18:37 AM: Task 3 started
19/11/2016 12:18:37 AM: Task 2 started
Exception 19/11/2016 12:18:40 AM: Task 1 19/11/2016 12:18:38 AM
Task.WaitAll | 작업이 완료 될 때까지 현재 스레드를 차단. |
Task.WhenAll | 작업이 완료 될 때까지 기다리는 동작을 나타내는 작업 을 반환. |
'C#' 카테고리의 다른 글
ADO.NET vs an ORM (Dapper & EF) (0) | 2021.10.13 |
---|---|
C# Single or array JSON converter. (0) | 2021.10.07 |
C# 정규식을 활용한 계좌번호 ,휴대폰 번호 마스킹 처리. (0) | 2021.09.08 |
c# Entity Framework (0) | 2021.08.29 |
[C#] Garbage Collection (0) | 2021.07.08 |