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

+ Recent posts