2012-09-01 4 views
0

작업을 사용하여 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) 

최종 하위

답변

0

는 고통스러운 작업입니다 충분한 지식과 기술을 필요로한다. .Net 4.5에 도입 된 async-await 키워드를 사용하여 위 코드를 다시 작성하면 동기 프로그래밍 모델에서와 같은 방식으로 예외를 처리 할 수 ​​있습니다. 물론 async-await이 적당하지 않고 TPL API를 직접 사용해야하는 상황이 있습니다.

.Net 디 컴파일러 (예 : .Net Reflector)를 사용하여 작업 컴파일러가 귀사를 대신하여 수행 한 작업량을 확인할 수 있으며, 또한 귀중한 학습 소스가 될 수 있습니다.

또한 TPL을 사용하여 병렬 프로그래밍을 할 때 예외 처리 방법에 대한 좋은 통찰력을 제공하는 Exception Handling with the Task Parallel Library을 살펴보십시오.

Stephen Toub이 제시 한 "The zen of async: Best practices for best performance"은 닷넷 4.5의 후드에서 어떻게 작동하는지에 대해 깊이 잠 들어 있습니다. 예외 처리가 그 중 하나 인 고급 주제를 다룹니다.

+0

나는이 오류 처리 문제가 Await로 훌륭하게 해결 될 수 있음을 알고 있습니다. 하지만 Await없이 사용하기에 강력한 오류 처리 패턴을 원합니다. 더 나은 의견을 가진 더 깨끗한 버전으로 내 코드 예제를 업데이트했습니다. –

+0

이 질문에 대한 더 자세한 설명은 [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/)를 참조하십시오. –

관련 문제