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.
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
[FEHLER] FATAL UNHANDLED EXCEPTION: System.AggregateException
Sind Sie sicher, dass jede Ausnahme abgefangen wird?
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
):
Tests (bestanden alle oben genannten Punkte):
%Vor%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%Tags und Links c# task-parallel-library task