タスクを使用してUIのブロックを解除し、Aync / Awaitを使用するオプションがない場合に、エラーを処理するための推奨される方法は何ですか?
私は通常、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)
サブ終了