방프리
24.01.04 Chapter3. 태스크 기반 비동기 프로그래밍 (Item 27) 본문
Item 27 : 비동기 작업에는 비동기 메서드를 사용하라
처음 async await을 이해할 때 굉장히 복잡했다. 어떤 매커니즘으로 돌아가는지??...
C++을 배울 땐 이런 개념이 없었고 CriticalSection, Mutex 같은 락 처리와 비슷한 내용이라 생각했다.
하지만 실제 업무에서 조금씩 사용해보면서 async await의 편리함과 내부 기능에 대해 이해가 될수록
굳이 복잡하게 이해할 필요가 없음을 느꼈다.
일단 async await을 사용하면 컴파일러가 비동기 메서드를 처리할 때는 비동기 작업을 시작하기 위한 기반 구조를
생성한다.
비동기 작업이 완료되면 이후의 작업을 계속 진행하게 하는데 대부분의 await 구문을 컴파일 하는 과정에서 이루어진다.
컴파일러는 await 구문 이후의 코드를 나중에 수행할 목적으로 델리게이트로 감싸고, 필수적인 데이터 구조를 생성한다.
이후 대기 중이던 태스크가 완료되면 이를 상태 정보로 저장하고, 앞서 작성한 델리게이트 (나중에 수행할 구문들)이 호출되도록 코드를 생성한다. 프로그램이 실행되면서 대기 중이던 태스크가 완료되면 이벤트를 일으켜 요청한 태스크가 완료되었음을 알린다. 그러면 비동기 메서드로 다시 진입하고 이전 상태가 복원된다. 이를 상태복원이라 한다.
간단히 요약하자면 async await은 여러 쓰레드가 접근할 수 있는 메서드를 상태 복원이라는 개념을 통해 쉽게 만들 수 있게 해준다.
여기서 좀 더 깊게 하면 스레드 컨텍스트를 스위치하지 않고 블록한 상태로 동작하게 할 것인가?(SnychronizationContext)
아니면 스위치를 지원하도록 할 것인가? (ConfigureAwait(false))도 나뉘게 된다.
물론 async await을 사용하지 않아도 비동기 메서드는 작성될 수 있다. 이 때 return 받는 형태로
Task.Wait() 혹은 Task<T>.Result 를 통해 대기할 수 있는데 이는 잘 못 사용하게 되면 교착상태를 일으킬 수 있기 때문에
정확한 이해를 한 후 사용해야 한다.
'C# > More Effective C#' 카테고리의 다른 글
24.01.07 Chapter3. 태스크 기반 비동기 프로그래밍 (Item 29) (0) | 2024.01.07 |
---|---|
24.01.04 Chapter3. 태스크 기반 비동기 프로그래밍 (Item 28) (0) | 2024.01.04 |
24.01.02 Chapter2. API 설계 (Item 26) (0) | 2024.01.02 |
24.01.01 Chapter2. API 설계 (Item 25) (0) | 2024.01.01 |
23.12.17 Chapter2. API 설계 (Item 24) (1) | 2023.12.17 |