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

Schreibe einen Kommentar