이 질문에는 이미 답변이 있습니다.
나는 단순한 구조를 가지고 있으며 그것이 작동해야하는 이유 (또는 작동하지 않는 이유)를 이해하기가 힘듭니다.
기본적으로 두 가지 방법이 있습니다.
private async void DoStuff()
{
try {
AuthenticationStuff();
}catch(UnauthorizedAccessException){
UI.Display("AMAGAD!");
}
}
private async void AuthenticationStuff()
{
var user = GetUser();
if(user == null) throw new UnauthorizedAccessException();
DoMoreAuthenticationStuff();
}
이제 문제는 예외가 결코 도달하지 않는다는 것입니다.DoStuff()
메서드의 핸들러. 내 첫 번째 본능은 "이봐, 비동기 메서드, 나는 그것을 기다려야한다"는 것이었지만 분명히 비동기 무효가 비동기와 다른 것Task<void>
.
나는 여기서 무슨 일이 벌어지고 있는지 이해하려고 노력하고있다. 예외가 처리기로 이동하는 이유는 무엇입니까? 대신 디버거가 중단됩니다."DoMoreAuthenticationStuff()
"처리되지 않은 예외 오류가 있습니까?
에 의해 제기 된 예외async void
방법은SynchronizationContext
그 방법이 시작되었을 때 활성화되어있었습니다. 이것은 피해야하는 이유 중 하나입니다.async void
. MSDN 문서에서이 내용과 다른 이유를 다룹니다.비동기 프로그래밍의 모범 사례.
이와 같은 예외를 잡으려면async void
방법async Task
과await
반환 된 태스크.
내 첫 번째 본능은 "이봐, 비동기 방식이야. 나는 기다려야 해. 그것 ",하지만 난 할 수 없어 분명히 비동기 무효 다른 비동기 작업에서.
너는 말할 수있다.async Task MyMethod()
. 그런 다음 예외를 전파하고 완료를 기다리는 결과를 기다릴 수 있습니다.
자세한 내용은 Stephen Cleary의 답변을 참조하십시오.