작업을 사용하여 UI 차단을 해제하고 Aync/Await 사용 옵션이 아닌 경우 오류를 처리하는 가장 좋은 방법은 무엇입니까?GUI에서 작업 예외를 처리하는 방법은 무엇입니까?
일반적으로 UI를 업데이트하고 Application_DispatcherUnhandledException 같은 전역 오류 처리기에서 예기치 않은 오류 (예외를 기록하고 사용자 및 종료 앱에 알리십시오)를 처리하여 예상 오류를 처리하려고합니다.
나는보기 흉한 다음과 같은 접근 방식으로 놀고있다. 다른 많은 물건을 취급와 함께 병렬 응용 프로그램의 예외를 처리
Private Sub _showAsyncButton_Click(sender As Object, e As RoutedEventArgs) Handles _showAsyncButton.Click
Dim task = New WebClient().DownloadStringTaskAsync("http://www.microsoft.com")
'Dim task = New WebClient().DownloadStringTaskAsync("forcing error in async I/O")
task.ContinueWith(
Sub()
_resultField.Text = task.Result
'Throw New ApplicationException("forcing error in End method")
End Sub, Nothing, Nothing, TaskScheduler.FromCurrentSynchronizationContext
).ContinueWith(
Sub(a)
Select Case True
Case TypeOf (a.Exception.GetBaseException) Is WebException AndAlso CType(a.Exception.GetBaseException, WebException).Status = WebExceptionStatus.NameResolutionFailure
'Handle expected error
Dispatcher.Invoke(Sub() MessageBox.Show("Cannot access web site. Please try again later"))
Case Else
'Rethrow unexpected error in global error handler
Dispatcher.BeginInvoke(Sub() ExceptionDispatchInfo.Capture(a.Exception).Throw())
'ExceptionDispatchInfo.Capture(aex).Throw() 'Does not work
End Select
End Sub, TaskContinuationOptions.OnlyOnFaulted)
최종 하위
나는이 오류 처리 문제가 Await로 훌륭하게 해결 될 수 있음을 알고 있습니다. 하지만 Await없이 사용하기에 강력한 오류 처리 패턴을 원합니다. 더 나은 의견을 가진 더 깨끗한 버전으로 내 코드 예제를 업데이트했습니다. –
이 질문에 대한 더 자세한 설명은 [GUI가없는 상태로 작업 예외를 처리하는 방법을 참조하십시오. ] (http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/7e71f7e1-6c89-4129-bd74-bc6adb1242d1). 다른 해결책은 [Task.ContinueWith()에 대한 예외 처리 래퍼] (http://www.rizalalmashoor.com/blog/exception-handling-wrappers-for-taskcontinuewith/)를 참조하십시오. –