0

이 질문에는 이미 답변이 있습니다.

나는 단순한 구조를 가지고 있으며 그것이 작동해야하는 이유 (또는 작동하지 않는 이유)를 이해하기가 힘듭니다.

기본적으로 두 가지 방법이 있습니다.

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()"처리되지 않은 예외 오류가 있습니까?

2 답변


2

에 의해 제기 된 예외async void방법은SynchronizationContext그 방법이 시작되었을 때 활성화되어있었습니다. 이것은 피해야하는 이유 중 하나입니다.async void. MSDN 문서에서이 내용과 다른 이유를 다룹니다.비동기 프로그래밍의 모범 사례.

이와 같은 예외를 잡으려면async void방법async Taskawait반환 된 태스크.


  • 고마워, 스티븐! 내가 원했던 바로 그 것이다. 그리고 그 기사는 매우 통찰력이있었습니다! - Muhwu

0

내 첫 번째 본능은 "이봐, 비동기 방식이야. 나는 기다려야 해.   그것 ",하지만 난 할 수 없어 분명히 비동기 무효 다른   비동기 작업에서.

너는 말할 수있다.async Task MyMethod(). 그런 다음 예외를 전파하고 완료를 기다리는 결과를 기다릴 수 있습니다.

자세한 내용은 Stephen Cleary의 답변을 참조하십시오.

연결된 질문


관련된 질문

최근 질문