ContinueWith und TaskCancellation - Wie gibt man Standardwerte zurück, wenn die Aufgabe fehlschlägt?

8

Ich habe ein paar Threads über TaskCancellations gelesen. Ich kann jedoch keine Lösung für eine einfache Frage finden: Wie erhalte ich einen Standardwert, wenn meine Aufgabe fehlschlägt?

Ich kann (!) die Aufgabe selbst nicht ändern und versuche es mit einem Catch Wrapper zu umgehen. Ich könnte natürlich einen try-catch rum warten, aber ich würde gerne mit ContinueWith umgehen - wenn möglich.

%Vor%

Ich dachte, das wäre der richtige Weg, um mit dem Problem fertig zu werden. Meine Anwendung wirft jedoch eine JsonParseException (die in LoadMyExampleTask aufgerufen wird). Ich würde erwarten, null oder (noch besser) eine leere Liste zu bekommen.

Eigentlich will ich nur:

%Vor%

Basierend auf Luaans guter Antwort habe ich eine Erweiterungsmethode mit einer defaultValue-Option geschrieben:

%Vor%

Bearbeiten: await myTask.DefaultifFaulted() hat gerade ein

geworfen
  

[FEHLER] FATAL UNHANDLED EXCEPTION: System.AggregateException

Sind Sie sicher, dass jede Ausnahme abgefangen wird?

    
Frame91 10.12.2015, 09:13
quelle

2 Antworten

3

Wie versprochen, hier sind die DefaultIfFaulted<T> Varianten, die ihrem Namen (und dem Titel dieser Frage) entsprechen. Sie behalten das Verhalten der Vorgängeraufgabe bei, es sei denn, es liegt ein Fehler vor (insbesondere wird die Stornierung eher propagiert als ignoriert oder durch AggregateException maskiert):

Oldschool (.NET 4.0):

%Vor%

Async / Warte (einfach, aber langsamer):

%Vor%

Async / erwarten Weg (perf fast identisch mit Unwrap ):

%Vor%

Tests (bestanden alle oben genannten Punkte):

%Vor%     
Kirill Shlenskiy 10.12.2015, 11:09
quelle
9

Wenn Sie das möchten, müssen Sie die ursprüngliche Aufgabe nicht zurückgeben - Sie müssen die Fortsetzung zurückgeben.

%Vor%

Ihr ursprünglicher Code erlaubte die Fortsetzung, wenn die ursprüngliche Aufgabe fehlerhaft war, aber Sie haben den Status dieser Aufgabe nicht gelesen - die Tatsache, dass eine Aufgabe eine Fortsetzung hat, die Fehler behandelt, ist vollständig irrelevant für was ein await auf der ursprünglichen Aufgabe tun wird.

Natürlich ist es ziemlich einfach, dies zu einer generischen Hilfsmethode zu machen:

%Vor%     
Luaan 10.12.2015 09:16
quelle

Tags und Links