이 질문은 C # 언어와 관련이 있지만 Java 또는 TypeScript와 같은 다른 언어를 다루기를 기대합니다.
.NET에서 비동기 호출 사용에 대한 모범 사례 를 권장 합니다. 이러한 권장 사항 중에서 두 가지를 선택하십시오.
- 비동기 메소드의 서명을 변경하여 Task 또는 Task <>를 반환하십시오 (TypeScript에서는 Promise <>).
- xxxAsync ()로 끝나도록 비동기 메소드의 이름을 변경하십시오.
이제 하위 수준의 동기 구성 요소를 비동기 구성 요소로 교체하면 응용 프로그램의 전체 스택에 영향을줍니다. async / await는 "완벽하게"사용될 경우에만 긍정적 인 영향을 미치므로 응용 프로그램에있는 모든 계층의 서명 및 메서드 이름을 변경해야합니다.
좋은 아키텍처는 종종 각 계층 사이에 추상화를 배치하여 하위 수준의 구성 요소를 다른 구성 요소로 대체하는 것이 상위 구성 요소에 의해 보이지 않게합니다. C #에서 추상화는 인터페이스 형식을 취합니다. 새로운 저수준의 비동기 구성 요소를 도입하는 경우 호출 스택의 각 인터페이스를 수정하거나 새 인터페이스로 교체해야합니다. 구현 클래스에서 문제가 해결되는 방식 (비동기 또는 동기화)이 더 이상 호출자에게 숨겨지지 않습니다. 발신자는 동기화 또는 비동기인지 알아야합니다.
"좋은 아키텍처"원칙과 모순되는 모범 사례를 비 동기화 / 기다리지 않습니까?
각 인터페이스 (IEnumerable, IDataAccessLayer)는 비동기 종속성으로 전환 할 때 스택에서 대체 될 수 있도록 비동기 대응 물 (IAsyncEnumerable, IAsyncDataAccessLayer)이 필요합니까?
우리가 문제를 조금 더 추진한다면, 모든 메소드가 비동기 (태스크 <> 또는 Promise <>를 리턴하기 위해)라고 가정하고 실제로 비동기 호출을 동기화하지 않는 메소드를 가정하는 것이 더 간단하지 않을 것입니다 비동기? 이것은 미래의 프로그래밍 언어에서 예상되는 것입니까?
CancellationToken
. 기존 동기화 방법을 제거하고 모든 코드를 사전에 차단하는 것은 명백한 시작이 아닙니다.