2

Ich bin wie unten mit einer Funktion (nur relevanten Code für dieses Beispiel gehalten):Task.Run - Umgang mit Ausnahmen

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 

Wie Sie sehen können, Ich erzeuge eine Ausnahme, wenn ctr = 5 nur zu prüfen, wie die Ausnahme in der Benutzeroberfläche behandelt wird.

nenne ich dann diese Funktion in einer Schaltfläche Async Ereignis klicken:

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) 

Die Aufgabe wird vollständig ausgeführt statt bemängelt wird. Ich vermute, das ist, weil ein Wrapper-Task bis zum Abschluss ausgeführt wird, anstelle des ursprünglichen Tasks, der eine Ausnahme ausgelöst hat. Ich bin mir jedoch nicht sicher, wie ich zur ursprünglichen Aufgabe gelangen und die Ausnahme behandeln soll.

Ich habe mit Await versucht.

Try 
     Await RefreshCompanyCodesAsync() 
    Catch ax As AggregateException 
     MsgBox(ax.Message) 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 

Ausnahmen erhalten hier gefangen, aber das Problem ist ich mehrere Funktionen parallel von denen RefreshCompanyCodesAsync ist nur einer von ihnen beginnen müssen. Um dies zu tun, wäre es meiner Meinung nach am besten, diese Funktionalitäten über Task.Run zu starten.

Die eigentliche Funktionalität der Arbeiter-Funktion in meinem Fall umfangreiche DB und HttpClient Aktivität beinhaltet und während dieser Zeit wird die UI Ansprechbarkeit mich zu gehen für Task.Run oder Factory.StartNew

haben fährt auch versucht, die Aufgabe starten und Wartet darauf, um die Bewertung des Ergebnisses sicherzustellen. Allerdings wird meine Benutzeroberfläche blockiert, wenn ich Task.Wait mache.

Jede Hilfe wird wirklich geschätzt.

Antwort

2

Wahrscheinlich, was Sie wollen, ist

Dim task1 = RefreshCompanyCodesAsync() 

Auf diese Weise gibt es keine Wrapper Aufgabe. RefreshCompanyCodesAsync ist bereits nicht blockiert, was wichtig ist, damit Sie die Benutzeroberfläche nicht einfrieren.

Sie sollten vermeiden ContinueWith. Lieber warten, da Sie zurück zum UI-Thread geleitet werden.

Ich brauche dies in C# schreiben:

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

Thx. Aber gibt es einen Unterschied zwischen 'RefreshCompanyCodesAsync()' und 'Warten', solange es nur eine Aufgabe gibt? – Kallol

+1

Warten würde werfen und den Kontrollfluss abbrechen. Es würde dich zwingen zu fangen. Die Ausnahmebehandlung für den Kontrollfluss ist zu vermeiden. Dies ist jedoch für die Antwort unerheblich. – usr

Verwandte Themen