본문 바로가기

C#

비동기 프로그래밍(Task)에 알아보자

간혹 프로그램을 개발하다보면 비동기방식으로 API를 호출해야하는 경우가 존재합니다.
ex) API 호출 시간이 오래걸릴 경우, 동시에 여러 개의 API를 호출해야하는 경우

이때, Task 객체를 사용하여 비동기방식으로 API를 호출하는데 .NET FrameWork 4.5 이상에서는 async와 await 키워드를 지원하기때문에 비동기 프로그래밍을 할 수 있습니다.
하지만 .NET FrameWork 4.0의 경우 async와 await 키워드를 지원하지 않기 때문에 Nuget 패키지에서 Mircrosoft.bcl.Build.Symbols(MIT 라이센스) 패키지를 다운받아 비동기방식으로 API를 호출하면 됩니다.

for문을 통해 여러 API 호출을 병행할 때 함수의 매개변수로 전달될 값이 배열의 값을 전달할 경우 정확한 매개변수 값이 전달되지 않습니다.

for(int i=0;i<10;i++)
{
     Task.Factory.StartNew(()=>{ Add(i)});
}
Add 함수의 매개변수로 전달되는 i 값은 0부터 9까지 전달되는 것이 아닌
1, 1, 3, 5, 5 등으로 전달

하지만 foreach문을 통해 전달하면 함수의 매개변수 값을 정확하게 전달할 수 있습니다.

모든 Task 작업이 끝난 이후에 로직을 처리해야하는 경우도 있는데요. 
Task.Wait함수를 사용하면 모든 Task의 작업이 완료될 때 까지 기다릴 수 있습니다.
for문을 사용하여 여러  API 호출한 후 WaitAll을 사용하여 기다릴 경우
"하나 이상의 오류가 발생했다"는 Exception이 발생합니다.

모든 Task 작업이 끝난 후에 처리해야할 로직을 비동기 방식으로 처리해야한다면 
Task.ContinueWhenaAll 함수를 통해 모든 Task의 작업이 완료된 후 다른 Task 작업을 처리할 수 있습니다.