C#의 Task와 Thread를 비교하고 Async, Await에 대해 알아보기
질문
C#의 Task란?
C#의 Thread와 Task의 비교
- 생성 비용과 관리 방법
- 결과 처리 방법
C#의 Async/Await
Task
Task
- 비동기 프로그래밍과 병렬 처리를 위해 .NET에서 사용되는 클래스
System.Threading.Tasks
네임스페이스에 정의- .NET이 스레드 풀로 자동 관리해 스레드 생성 비용이 낮고 재사용이 가능하며, 효율적으로 자원을 관리
비동기 작업 단위
- 비동기 작업을 표현하는 고수준의 추상화 API
- 비동기 작업의 시작, 진행 중, 완료, 취소 등의 상태를 관리
결과 반환 가능
Task<TResult>
제네릭 클래스를 통해 작업 완료 시 결과 반환 가능- 비동기 작업 중 발생한 예외를
Task
객체를 통해 관리하고 처리
Thread
특징 | Task | Thread |
---|---|---|
생성 비용, 관리 | .NET이 스레드 풀로 자동 관리해 스레드 생성 비용이 낮고 재사용이 가능하며, 효율적으로 자원을 관리 | 스레드 생성 시마다 시스템 자원이 소비되며 생성 비용과 관리 비용이 크고 직접 해야 함 |
결과 반환 | Task<T> 를 통해 작업의 결과를 반환할 수 있음 | 직접 처리해야 하며, 반환 기능이 없음 |
비동기 프로그래밍 | 비동기/병렬 처리에 최적화됨 (async /await와 함께 사용) | 비동기 처리에 적합하지 않음(비동기 작업 구현 시 콜백이나 다른 동기화 메커니즘을 직접 관리해야 함) |
수명 | 작업이 끝나면 자동으로 반환 | 수동으로 스레드를 종료하거나 관리해야 함 |
상태 추적 | 작업 상태 추적 가능 | 상태를 직접 관리해야 함 |
Async, Await
Async
- 메서드를 비동기적으로 실행하겠다는 것을 나타냄
- 반환 타입으로
Task
또는Task<T>
를 사용해야 함 - 비동기 메서드는 이름에
async
를 붙임
Await
- 비동기 작업의 완료를 기다리고, 완료 후 다음 코드를 실행
await
를 사용하면 코드 흐름이 동기적으로 보이지만 실제로는 비동기적으로 실행- 호출하는 작업이 완료될 때까지 호출한 메서드의 나머지 실행을 일시 중단하고, 다른 작업을 수행할 수 있게 함
Task와 Async/Await의 동작 과정
async
메서드 호출- 호출 즉시 실행되지 않고
Task
객체를 반환
- 호출 즉시 실행되지 않고
await
키워드 사용- 비동기 작업이 완료될 때까지 기다렸다가 결과 반환
- 컨텍스트 전환
- UI 스레드가 아닌 별도의 스레드에서 작업을 수행
- 작업이 완료되면 다시 원래의 스레드로 복귀