피드로 돌아가기
Dev.toBackend
원문 읽기
Thread Blocking 제거를 통한 C# 애플리케이션 동시 처리량 극대화
C# Async/Await and Delegates/Events: The Concepts Behind Every Responsive Application
AI 요약
Context
동기식 I/O 처리 방식의 Thread-per-request 모델에서 발생하는 Thread Exhaustion 문제 분석. 특히 데이터베이스 쿼리 대기 시간 동안 Thread가 유휴 상태로 유지되어 하드웨어 자원 효율성이 저하되는 한계 직면.
Technical Solution
- async/await 패턴 도입을 통한 I/O Bound 작업의 Non-blocking 처리 구조 설계
- await 호출 시 실행 Thread를 Thread Pool로 즉시 반환하여 다른 요청을 처리하도록 하는 자원 최적화
- Task.WhenAll을 활용해 독립적인 비동기 작업들을 병렬 실행함으로써 전체 응답 시간 단축
- Func, Action, Predicate 등 Generic Delegate를 통한 메서드 참조의 데이터화 및 타입 안정성 확보
- Event 패턴을 통한 Publisher와 Subscriber 간의 Loose Coupling 구조 구현으로 시스템 확장성 강화
- async void 사용을 Event Handler로 제한하여 Exception Propagation 경로 확보 및 프로세스 크래시 방지
실천 포인트
- 독립적인 비동기 작업은 개별 await 대신 Task.WhenAll로 묶어 실행하고 있는가 - .Result나 .Wait()를 사용해 비동기 메서드를 동기적으로 호출하여 Deadlock 위험을 초래하지 않았는가 - async void 사용을 지양하고 Exception 핸들링이 가능한 async Task를 반환하는가 - 커스텀 Delegate 정의 대신 표준 Generic Delegate(Func, Action)를 우선 고려했는가 - Event 발생 시 null-conditional invoke(?.) 패턴으로 NullReferenceException을 방지했는가