Verwenden von Tasks mit bedingten Fortsetzungen
Ich bin ein wenig verwirrt darüber, wie Sie mithilfe von Aufgaben mit bedingten Fortsetzungen.
Wenn ich eine Aufgabe, und dann will ich weiterhin mit Aufgaben, die mit Erfolg und Fehler, und warten dann auf diese zu vervollständigen.
void FunctionThrows() {throw new Exception("faulted");}
static void MyTest()
{
var taskThrows = Task.Factory.StartNew(() => FunctionThrows());
var onSuccess = taskThrows.ContinueWith(
prev => Console.WriteLine("success"),
TaskContinuationOptions.OnlyOnRanToCompleted);
var onError = taskThrows.ContinueWith(
prev => Console.WriteLine(prev.Exception),
TaskContinuationOptions.OnlyOnFaulted);
//so far, so good
//this throws because onSuccess was cancelled before it was started
Task.WaitAll(onSuccess, onError);
}
Ist dies die bevorzugte Art und Weise zu tun, Aufgabe, Erfolg/Misserfolg Verzweigung? Auch, wie soll ich beitreten, um alle diese Aufgaben nehmen wir an, ich habe eine lange Reihe von Fortsetzungen, die jeweils Ihre eigene Fehlerbehandlung.
//for example
var task1 = Task.Factory.StartNew(() => ...)
var task1Error = task1.ContinueWith( //on faulted
var task2 = task1.ContinueWith( //on success
var task2Error = task2.ContinueWith( //on faulted
var task3 = task2.ContinueWith( //on success
//etc
Aufrufen WaitAll
auf diese unweigerlich wirft, weil einige der Fortsetzungen storniert aufgrund der TaskContinuationOptions
und die Berufung Wait
auf eine abgebrochene Aufgabe löst.
Wie melde ich mich an diese, ohne die "Eine Aufgabe wurde abgebrochen" Ausnahme"?
InformationsquelleAutor der Frage dan | 2011-04-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Ihr Hauptproblem ist, dass du sagst, diese beiden Aufgaben zu "Warten" mit Ihrem Aufruf
Den onSuccess und onError Fortsetzungen sind setup automatisch für Sie und werden ausgeführt nach Ihre vorhergehende Aufgabe abgeschlossen ist.
Wenn Sie ersetzen Sie einfach Ihre
Task.WaitAll(...)
mittaskThrows.Start();
ich glaube, Sie werden die gewünschte Ausgabe erhalten.Hier ist ein bisschen ein Beispiel, das ich zusammengestellt habe:
InformationsquelleAutor der Antwort Bryan Ray
Verwenden
Task.WaitAny(onSuccess, onError);
InformationsquelleAutor der Antwort Dejisys
Ist das nicht normal?
Blick auf die MSDN-Dokumentation, die Sie tun es in Ordnung und der Logik, die Sie implementieren, ist der Klang. Das einzige, was Ihnen noch fehlt, ist die Verpackung der WaitAll-Aufruf in eine AggregateException-wrapper in etwa so:
Können Sie hier mehr Lesen:
http://msdn.microsoft.com/en-us/library/dd270695.aspx
Im wesentlichen das fangen einer AggregatedException bekommt Sie das gleiche wie der Abschluss WaitAll. Es ist eine Sammlung aller Ausnahmen kehrten von Ihren Aufgaben.
InformationsquelleAutor der Antwort Khepri