async
: 비동기 작업을 수행하는 메서드를 정의하는 데 사용되는 키워드비동기 작업은 오랜 시간이 걸리는 작업(네트워크 요청, 파일 입출력 등)이나 CPU 집약적인 작업을 비차단적으로 실행하고, 작업이 완료되면 결과를 반환하거나 다른 코드를 실행할 수 있도록 한다. 즉 작업을 실행하고 완료될 때까지 대기하지 않고 다른 작업을 수행할 수 있도록 하는 것이다.
이러한 async는 void와 Task 두 가지 반환 형을 갖는다.
void 리턴
- async void 메서드는 비동기 작업을 수행하지만, 작업의 완료를 기다리지 않는다.
- void를 반환하기 때문에 완료 시점에서 결과를 반환하거나 처리할 수 없다.
- 주로 이벤트 핸들러나 UI 이벤트 처리 등 비동기 작업의 완료 시점에 따라 추가적인 동작이 필요한 경우에 사용된다.
- 예외 처리가 어렵고 예외가 발생하면 애플리케이션 전체를 종료시킬 수 있으므로 주의해야 한다.
Task 리턴
- async Task 메서드는 비동기 작업을 수행하고, 작업의 완료를 기다릴 수 있다.
- Task를 반환하기 때문에 작업이 완료되면 해당 작업의 결과를 반환하거나 추가적인 처리를 할 수 있다.
- await 키워드를 사용하여 작업의 완료를 대기하고, 작업이 완료되면 반환된 결과를 사용할 수 있다.
- 예외 처리가 용이하며, 예외가 발생한 경우 Task 객체에 예외 정보가 포함되어 있다.
Task를 반환형으로 사용하는 코딩이 안전하고 유연하다.
await
: 비동기 메서드에서 사용되며, 비동기 작업의 완료를 기다릴 때 사용하는 키워드.await 키워드를 사용하면 비동기 작업이 완료될 때까지 현재 메서드의 실행을 일시 중지하고, 작업이 완료되면 다음 코드를 실행한다.
위 코드는 Task.Dealy가 제대로 작동하지 않는다.
Wait를 동작시키지 않았기 때문.
그렇기에 위와 같은 결과가 출력된다.
이때,
위와 같이, Task.Delay를 인스턴스화 하여, await 시킨다면,
정상적으로 1초 동안 대기하게 되며,
Print2 Sync가 정상적으로 종료되지 않고, 메인 함수가 종료되어버리는 것을 확인할 수 있다.
이는 메인 메서드에서 Wait를 하지 않기 때문이다.
Print2의 작업이 종료될 때까지, 대기하기 위해서는 await 키워드를 이용하면 된다.
위와 같이 정상적으로 비동기 함수가 종료될 때까지, 대기하는 것을 확인할 수 있다.
인트형을 반환하는 Task, t1을 람다식으로 실행할 작업을 구현.
이후, t1 작업이 끝날 때까지, await를 이용하여 대기 후에, result에 반환된 값을 저장하여, 출력하는 함수다.
Main함수에서도 awiat를 이용하여 Run() 함수가 작업을 마칠 때까지, 대기한다.
위는 완료한 작업을 출력한 결과물이다.
Task t1은 매개변수인 start부터 end까지, 누적연산을 하는 비동기 함수이다.
모든 로직이 끝났을 때, t1의 반환 값인 total을 리턴해준다.
상단은 메인 함수에서 하나의 Task. 즉, 단일 스레드를 이용하여 Sum 작업을 하는 코드이다.
결과는 다음과 같다.
약 5초 정도의 시간이 소요된 것을 확인할 수 있다.
상단은 다섯 개의 Task를 이용하여, 다중스레드 작업을 하는 코드이다.
반복문을 이용하여, 분할한 새그먼트를 시작점과 종착점으로 설정하고, 각 task를 순회하며, 작업을 시작 한다.
WhenAll 메서드를 이용하여, 모든 작업이 완료될 때까지 대기 후, total값을 구한다.
결과물 출력 시, 소요시간이 훨씬 짧아진 것을 확인할 수 있다.