Asynchronous(비동기)

Overview : 영어를 한국어로 번역 했는대도 어려운 용어,
“동일 시간선 상이 아닌 프로세스” 으로 이해 하는게 좋음

synchronous

이해해야 할 주요 부분

  • 비동기 코드는 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가 완료될 때까지 대기하는 수단으로 현재 스레드를 차단하면 교착 상태가 발생하고 컨텍스트 스레드가 차단될 수 있고 더 복잡한 오류 처리가 필요할 수 있습니다. 다음 표에서는 비차단 방식으로 작업 대기를 처리하는 방법에 대한 지침을 제공합니다.
사용 방법대체 방법수행할 작업
awaitTask.Wait 또는 Task.Result백그라운드 작업의 결과 검색
await Task.WhenAnyTask.WaitAny한 작업이 완료될 때까지 대기
await Task.WhenAllTask.WaitAll모든 작업이 완료될 때까지 대기
await Task.DelayThread.Sleep일정 기간 대기

참조 : https://learn.microsoft.com/ko-kr/dotnet/csharp/async