비동기 void
메소드의 예외 처리
비동기 프로그래밍을 위해 Microsoft의 Async CTP를 사용하는 경우 비동기 void
메서드의 예외 처리 동작을 이해하는 것이 중요합니다. 다음 시나리오를 고려해보세요.
<code class="language-csharp">public async void Foo() { var x = await DoSomethingAsync(); } public void DoFoo() { try { Foo(); } catch (ProtocolException ex) { // 异常将永远不会被捕获。 } }</code>
질문: 비동기 메서드 DoFoo
에서 발생한 예외를 호출 메서드 Foo
에서 포착할 수 있습니까?
답변: 예(단, 전제 조건이 있음)
예외는 호출 코드까지 표시되지만 await
또는 Wait()
Foo
에 대한 호출이 필요한 경우에만 해당됩니다. 코드를 다음과 같이 수정하세요.
<code class="language-csharp">public async Task Foo() { var x = await DoSomethingAsync(); } public async void DoFoo() { try { await Foo(); } catch (ProtocolException ex) { // 异常将被捕获,因为它是一个异步方法。 } } public void DoFoo() { try { Foo().Wait(); } catch (ProtocolException ex) { // 异常将被捕获,因为调用被等待。 } }</code>
이를 통해 호출 코드에서 예외 처리가 가능해집니다.
그러나 비동기 프로그래밍 분야의 권위자인 Stephen Cleary는 다음과 같이 경고합니다.
또한"비동기
void
메서드는 오류 처리 의미가 다릅니다. 비동기Task
또는 비동기Task<T>
메서드에서 예외가 발생하면 해당 예외가 포착되어Task
객체에 배치됩니다. 비동기void
메서드의 경우Task
개체가 없으므로 비동기void
메서드에서 발생한 모든 예외는 비동기void
메서드가 시작될 때 활성화된SynchronizationContext
에서 직접 발생합니다.
을 사용하여 작업이 완료될 때까지 기다리면 .NET에서 메서드를 동기식으로 실행하기로 결정한 경우 애플리케이션이 차단될 수 있습니다. Wait()
위 내용은 Async Void 메서드에서 발생한 예외를 메서드 호출로 포착할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!