取り扱い:= 5 CTRだけでチェックするときTask.Runは - 私は(この例にのみ関連コードを保った)、以下のような機能を有する午前例外
Public Async Function RefreshCompanyCodesAsync() As Task(Of Boolean)
For ctr=1 to 2000
Await Task.Delay(1000).ConfigureAwait(False)
If ctr=5 Then Throw New ApplicationException("Why 5?")
Next
return true
End Function
あなたが見ることができるように、私は例外を生成しています例外がUIでどのように処理されるか。
私は、ボタン内でこの機能がAsync
イベントをクリックして呼び出します。
Dim task1 = Task.Run(Sub()
RefreshCompanyCodesAsync()
End Sub)
Dim cTask = task1.ContinueWith(Sub(antecedent)
If task1.Status = TaskStatus.RanToCompletion Then
MsgBox("All done")
ElseIf task1.Status = TaskStatus.Faulted Then
MsgBox(task1.Exception.GetBaseException().Message)
End If
End Sub)
タスクではなく、障害が発生しているの完了まで実行されます。ラッパータスクが例外をスローした元のタスクではなく、完了まで実行されるため、私はそれを推測しています。ただし、元のタスクに到達して例外を処理する方法がわかりません。
私はAwait
で試しました。
Try
Await RefreshCompanyCodesAsync()
Catch ax As AggregateException
MsgBox(ax.Message)
Catch ex As Exception
MsgBox(ex.Message)
End Try
例外はここで捕まるが、問題は、私はRefreshCompanyCodesAsync
だけでそのうちの一つとなっている並列に複数の機能を起動する必要があります。これを行うために、私はTask.Runを介してそれらの機能を起動することが最良の賭けと考えています。
私の場合における労働者機能の実際の機能は、大規模なDBとHttpClient
活動に関与し、この時間の間に、UIの応答性はまたTask.Run
またはFactory.StartNew
のために行く方に私を運転している、タスクを起動しようとしていると結果の評価を確実にするために待っています。しかし、私がUIをブロックすると、Task.Wait
が表示されます。
本当にありがとうございます。
Thxを。しかし、これと 'Await RefreshCompanyCodesAsync()'との間には1つのタスクしかない限り、違いはありますか? – Kallol
制御フローを投げて中止するのを待つ。それはあなたをつかまえてしまうでしょう。制御フローの例外処理は避けなければならない。しかし、これは答えにとって重要ではありません。 – usr