1. async/await 의 내부 동작(상태 머신)과 동기 블로킹 데드락

난이도 상 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C#
// ============================================================================
// [언어 내부동작 문제] C# - async/await 의 내부 동작(상태 머신)과 동기 블로킹 데드락
// ----------------------------------------------------------------------------
// 주제: async/await 는 컴파일러가 무엇으로 바꾸며(상태 머신), 왜 .Result/.Wait() 로
//       비동기 메서드를 동기 대기하면 데드락이 날 수 있는가?
//   - 이 문제는 "결함을 고치는" 문제가 아니라, C# 의 동작 원리를 설명하는 문제다.
//   - 게임서버/툴에서 흔한 안티패턴: 동기 메서드 안에서 비동기 API 를 .Result 로 기다림.
//
// 과제:
//   1) SynchronizationContext 가 있는 환경(UI/구 ASP.NET 등)에서 Deadlock() 호출 시
//      무슨 일이 일어나는지 예측하라.
//   2) async/await 가 컴파일 후 무엇이 되는지(상태 머신·MoveNext·continuation·context 캡처)
//      내부 동작으로 설명하라.
//   3) ConfigureAwait(false) / 끝까지 async / async void 의 차이가 결과를 어떻게 바꾸는지
//      설명하라.
//   (먼저 직접 예측·설명을 적은 뒤 answer.md 와 대조할 것)
// ============================================================================

using System;
using System.Threading.Tasks;

public class AsyncInternals
{
    // 비동기 작업: 잠시 대기 후 값을 돌려줌
    public async Task<int> LoadAsync()
    {
        // (A) await 이후의 "이어지는 코드(continuation)"는 어디서 실행되는가?
        await Task.Delay(100);
        return 42;
    }

    // (B) 동기 메서드 안에서 비동기 결과를 .Result 로 블로킹 대기
    public int Deadlock()
    {
        Task<int> t = LoadAsync();
        return t.Result;   // 현재 스레드를 블록한 채 완료를 기다림
    }

    // (C) async void — 예외/완료를 호출자가 관측할 수 있는가?
    public async void FireAndForget()
    {
        await Task.Delay(50);
        throw new InvalidOperationException("boom");
    }
}
내 리뷰 · C#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.