좋아, 이상하게 들리지만 코드는 매우 간단하고 상황을 잘 설명합니다.
public virtual async Task RemoveFromRoleAsync(AzureTableUser user, string role)
{
AssertNotDisposed();
var roles = await GetRolesForUser(user);
roles.Roles = RemoveRoles(roles.Roles, role);
await Run(TableOperation.Replace(roles));
}
(저는 초록에서 일종의 이야기를하고 있지만 위의 내용은 실제로 여기에서 요구하는 것을 실제로 수행하는 실제 생산 코드의 실제 방법이며 실제로는 귀하의 실제 검토에 관심이 있습니다 정확성을 위해 async / await 패턴을 사용하십시오.)
나는 async/ await더 많이 사용하기 때문에이 패턴이 점점 더 자주 발생합니다 . 패턴은 다음과 같은 일련의 이벤트로 구성됩니다.
- 내가 작업해야 할 정보를 얻는 최초의 전화를 기다립니다
- 해당 정보에 대해 동 기적으로 작업
- 업데이트 된 작업을 저장하는 최종 통화를 기다립니다
위의 코드 블록은 일반적으로 이러한 메소드를 처리하는 방법입니다. 나는 await내가 비동기이기 때문에해야하는 첫 번째 호출. 다음으로 IO 또는 리소스 바운드가 아닌 비동기 작업이 필요한 작업을 수행합니다. 마지막으로, 나는 또한 async호출 인 나의 일을 저장 하고,화물 컬트에서 벗어납니다 await.
그러나 이것이이 패턴을 처리하는 가장 효율적이고 올바른 방법입니까? await마지막 전화를 건너 뛸 수있는 것처럼 보이지만 실패하면 어떻게됩니까? 그리고 동기 작업을 원래 호출과 연결 Task하는 것과 같은 방법을 사용해야 ContinueWith합니까? 나는 이것을 올바르게 처리하고 있는지 확실하지 않은 시점에 있습니다.
예제에 코드가 주어지면 이 async / sync / async 메서드 호출 체인을 처리하는 더 좋은 방법이 있습니까?