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#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.