C#에서 async 메서드를 기다리는 방법
😢상황
- C#에서
async
메서드를 정의하고 실행했지만, 결과를 기다리지 않고 다음 코드가 실행되어 문제가 발생 - 예: 파일 다운로드, 네트워크 요청, 딜레이 등 비동기 작업이 완료되기 전에 다음 로직이 실행됨
🛠️해결법
방법 1: await
키워드 사용
async Task MyAsyncMethod()
{
await Task.Delay(1000);
Console.WriteLine("1초 후 실행됨");
}
await MyAsyncMethod(); // 반드시 비동기 문맥 내에서 호출
💡
await
는 해당 비동기 작업이 끝날 때까지 기다림
방법 2: Task.Result
또는 Task.Wait()
사용 (동기 방식)
Task task = MyAsyncMethod();
task.Wait(); // 또는 task.Result;
🔸 동기 방식으로 기다림. UI 쓰레드에서 사용하면 데드락 위험이 있으므로 주의
🔸 콘솔 앱이나 테스트 환경에서는 유용할 수 있음
방법 3: Main 메서드에서 async 사용 (C# 7.1 이상)
static async Task Main(string[] args)
{
await MyAsyncMethod();
}
💡 프로그램 진입점에서도 비동기 실행이 가능
✅정리: 왜 이게 효과 있었는가?
async
메서드는Task
또는Task<T>
를 반환하므로, 반드시await
를 사용하여 기다려야 실행 순서가 보장됨await
는 컴파일러가 상태 기계를 만들어 흐름을 자동으로 이어줌- 잘못된 호출(예:
MyAsyncMethod();
만 호출) 시에는 비동기 작업이 실행되더라도 제대로 기다려지지 않음