2. C# 비동기 프로그래밍 : async, await 이해
지난 포스팅에 이어 이번 포스팅은 C#의 비동기 프로그래밍에서 중요한 async, await에 대해 정리하였습니다.
실제로 Task와 정말 많이 쓰고 중요한 키워드입니다.
코드 예제들과 같이 한번 알아보겠습니다!
| 동기, 비동기 이해
async와 await는 비동기 프로그래밍을 위한 키워드입니다.
하지만 이를 이해하기 이전에 먼저 동기와 비동기의 개념에 대해 알아야 합니다.
| 동기 (Synchronous) : 한 가지 작업이 완료되어야만 다음 작업이 시작되는 방식
동기 실행을 이해하는 방법 중 한 가지는 시간이 순차적으로 흐르는 것을 상상하는 것입니다.
위 그림을 생각해 보면 Task1, Task2, Task3이 순차적으로 실행되며
Task1이 실행이 완료되어야 Task2가 실행되는 구조입니다.
| 비동기 (Asynchronous) : 한 가지 작업이 완료되지 않아도 다음 작업이 시작될 수 있는 방식
비동기 실행은 여러 일이 동시에 발생하는 것을 이해하는 것입니다.
Task1이 실행되는 도중에 Task2가 실행되며 Task3이 실행되는 것이며
이는 Task1이 완료되기를 기다리지 않는다는 뜻입니다.
이런 방식으로 동기와 비동기의 차이를 이해하면 조금 더 받아들이기 쉽지 않을까 쉽습니다.
| async, await 키워드 이해
동기, 비동기에 대해 간단하게 확인했고 이제 async와 await에 대해 알아보겠습니다.
| async
async는 비동기 메서드를 선언할 때 사용하는 키워드입니다.
이 키워드를 사용하면 메서드의 실행을 비동기적으로 만들 수 있습니다.
async 키워드는 메서드, 람다 식 또는 익명 메서드에 사용할 수 있으며
키워드가 붙은 메서드는 Task, Task<T> 또는 void를 반환합니다.
그러나 보통은 void 대신 Task나 Task<T>를 반환하는 것이 좋습니다.
| await
await는비동기 메서드 내에서 사용되는 키워드입니다.
이 키워드는 Task, Task<T>를 반환하는 메서드나 표현식 앞에 사용할 수 있습니다.
해당 비동기 작업이 완료될 때까지 현재 메서드의 실행을 일시 중지시키며
비동기 작업이 완료되면 메서드의 실행을 계속 진행합니다.
이때 중요한 점은 await 키워드가 메서드의 실행을 일시 중지시킨다고 해도,
전체 프로그램의 실행을 중지시키는 것이 아니라는 점입니다.
따라서 await 키워드를 사용하면 비동기 작업이 실행되는 동안에도 다른 작업을 실행할 수 있습니다.
다음은 async와 await를 사용한 간단한 예제입니다.
예시) 파일에서 데이터를 비동기적으로 읽는 작업
public async Task<string> ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
string content = await reader.ReadToEndAsync();
return content;
}
}
StreamReader.ReadFileAsync() 메서드를 사용하여 파일의 내용을 비동기적으로 읽는 예제입니다.
await 키워드는 이 작업이 완료될 때까지 메서드를 일시 중지 시키고 완료되면 결과를 반환합니다.
이처럼 비동기 프로그래밍을 통해 시간이 오래 걸리는 작업을 처리하면,
그 작업이 완료되는 동안 프로그램이 다른 작업을 수행하도록 하여 프로그램의 반응성을 높일 수 있습니다.
| async, await 동작 원리
- aysnc 키워드를 사용하여 메서드를 비동기 메서드로 변환
- 이때 메서드의 본문에서 await 키워드 사용 가능 - await 키워드를 사용하여 비동기 메서드 내에서 중단점 지정
- 컴파일러에게 비동기 작업이 끝나기 전에는 현재 지점 이후로 진행할 수 없음을 알리고,
제어를 호출자에게 넘김 - await 키워드가 적용되면 호출 메서드를 일시 중단하고 대기 작업이 완료될 때까지 다시 호출자에게 양도
- await는 현재 실행을 잠시 보류하는 것이기 때문에, 제어가 호출자에게 넘어갈 때 finally 블럭이 실행하지 않음
- await 키워드가 적용되면 바깥쪽 메서드를 일시 중단하지 않고 작업 결과를 즉시 반환합니다.
| 마무리
async와 await를 사용하면 복잡한 비동기 로직을 간결하고 읽기 쉽게 표현할 수 있습니다.
하지만 비동기 프로그래밍은 복잡성을 증가시키므로 필요한 곳에 적절히 사용하는 게 중요합니다.
앞으로 비동기 프로그래밍에 대한 내용을 계속 작성할 생각이며
틀린 점이나 질문이 있으시면 댓글로 남겨주세요!
다음 포스팅으로 찾아오겠습니다.
감사합니다 :)
'C#' 카테고리의 다른 글
C# 비동기 프로그래밍 : Thread와 Task의 차이점 (0) | 2023.11.21 |
---|---|
C# 비동기 프로그래밍 : Task의 연속 작업 (Continuations) 이해 (0) | 2023.11.20 |
C# 비동기 프로그래밍 : Task 이해 (0) | 2023.11.16 |
C# 멀티캐스트 이벤트 이해 : 다중 이벤트 핸들러 관리 (0) | 2023.11.02 |
C# 이벤트 정의와 등록 및 제거 방법 (0) | 2023.11.01 |