Overview : 영어를 한국어로 번역 했는대도 어려운 용어,
“동일 시간선 상이 아닌 프로세스” 으로 이해 하는게 좋음
이해해야 할 주요 부분
- 비동기 코드는 I/O 바인딩된 코드와 CPU 바인딩된 코드에 둘 다 사용할 수 있지만 시나리오마다 다르게 사용됩니다.
- 비동기 코드는 백그라운드에서 수행되는 작업을 모델링하는 데 사용되는 구문인
Task<T>
및Task
를 사용합니다.(1 , 3) async
키워드는 본문에서await
키워드를 사용할 수 있는 비동기 메서드로 메서드를 변환합니다. (6)await
키워드가 적용되면 이 키워드는 호출 메서드를 일시 중단하고 대기 작업이 완료할 때까지 제어 권한을 다시 호출자에게 양도합니다. (6)await
는 비동기 메서드 내부에서만 사용할 수 있습니다. (6)
중요한 정보 및 조언
비동기 프로그래밍을 사용하는 경우 예기치 않은 동작을 방지할 수 있는 몇 가지 세부 정보를 고려해야 합니다.
async
메서드에 다음에await
가 반드시 있어야 합니다. * (6)
없으면 C# 컴파일러가 경고, C# 컴파일러가 비동기 메서드에 대해 생성한 상태 시스템이 아무것도 수행하지 않기 때문에 매우 비효율적입니다.- 작성하는 모든 비동기 메서드 이름의 접미사로 “Async”를 추가합니다. (1)
이 규칙을 .NET에서 사용하여 동기 및 비동기 메서드를 더 쉽게 구별할 수 있습니다. 코드에서 명시적으로 호출되지 않은 특정 메서드(예: 이벤트 처리기 또는 웹 컨트롤러 메서드)가 반드시 적용되는 것은 아닙니다. 이러한 메서드는 코드에서 명시적으로 호출되지 않으므로 명시적으로 명명하는 것은 별로 중요하지 않습니다. async void
는 이벤트 처리기에만 사용해야 합니다. (1)
이벤트에는 반환 형식이 없어서Task
및Task<T>
를 사용할 수 없으므로 비동기 이벤트 처리기가 작동하도록 허용하는 유일한 방법은async void
입니다.async void
의 다른 사용은 TAP 모델을 따르지 않고 다음과 같이 사용이 어려울 수 있습니다.async void
메서드에서 throw된 예외는 해당 메서드 외부에서 catch될 수 없습니다.async void
메서드는 테스트하기가 어렵습니다.- 호출자가
async void
메서드를 비동기로 예상하지 않을 경우 이러한 메서드는 의도하지 않은 잘못된 결과를 일으킬 수 있습니다.
- LINQ 식에서 비동기 람다를 사용할 경우 신중하게 스레드
LINQ의 람다 식은 연기된 실행을 사용합니다.
즉, 예상치 않은 시점에 코드 실행이 끝날 수 있습니다. 이 코드에 차단 작업을 도입하면 코드가 제대로 작성되지 않은 경우 교착 상태가 쉽게 발생할 수 있습니다. 또한 이 코드처럼 비동기 코드를 중첩하면 코드 실행에 대해 추론하기가 훨씬 더 어려울 수도 있습니다. 비동기 및 LINQ는 강력하지만 가능한 한 신중하고 분명하게 함께 사용되어야 합니다.
- 비차단 방식으로 작업을 기다리는 코드 작성
Task
가 완료될 때까지 대기하는 수단으로 현재 스레드를 차단하면 교착 상태가 발생하고 컨텍스트 스레드가 차단될 수 있고 더 복잡한 오류 처리가 필요할 수 있습니다. 다음 표에서는 비차단 방식으로 작업 대기를 처리하는 방법에 대한 지침을 제공합니다.
사용 방법 | 대체 방법 | 수행할 작업 |
await | Task.Wait 또는 Task.Result | 백그라운드 작업의 결과 검색 |
await Task.WhenAny | Task.WaitAny | 한 작업이 완료될 때까지 대기 |
await Task.WhenAll | Task.WaitAll | 모든 작업이 완료될 때까지 대기 |
await Task.Delay | Thread.Sleep | 일정 기간 대기 |
참조 : https://learn.microsoft.com/ko-kr/dotnet/csharp/async