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.
Thx. Aber gibt es einen Unterschied zwischen 'RefreshCompanyCodesAsync()' und 'Warten', solange es nur eine Aufgabe gibt? – Kallol
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