2

取り扱い:= 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が表示されます。

本当にありがとうございます。

答えて

2

おそらく、あなたが欲しいのは

Dim task1 = RefreshCompanyCodesAsync() 

何のラッパータスクが存在しないことの方法です。 RefreshCompanyCodesAsyncはすでに非ブロッキングであり、UIをフリーズしないように重要です。

ContinueWithを避ける必要があります。 UIスレッドにマーシャリングするので、待ちます。

私はC#でこれを書く必要があります:

var task1 = RefreshCompanyCodesAsync(); 
await Task.WhenAny(task1); //Wait without throwing. 
MessageBox.Show(task1.Status.ToString()); 
+0

Thxを。しかし、これと 'Await RefreshCompanyCodesAsync()'との間には1つのタスクしかない限り、違いはありますか? – Kallol

+1

制御フローを投げて中止するのを待つ。それはあなたをつかまえてしまうでしょう。制御フローの例外処理は避けなければならない。しかし、これは答えにとって重要ではありません。 – usr

関連する問題