Wer hat meine Aufgabe abgebrochen?
Meine C # -Aufgabe wird abgebrochen, aber nicht von mir. Ich bekomme kein Stacktrace und kann nicht herausfinden, wo das Problem auftritt.
Mein Aufgabenaufruf sieht folgendermaßen aus:
var t = Task<Boolean>.Factory.StartNew(() =>
{
Boolean bOk = DoSomthingImportant();
return bOk;
}, TaskCreationOptions.AttachedToParent)
.ContinueWith<Boolean>((theTask) =>
{
var reason = theTask.IsCanceled ? "it was canceled" : "it faulted";
Debug.WriteLine("Error: Task ended because " + reason + ".");
... log the exception to one of my objects...
return false;
}, TaskContinuationOptions.NotOnRanToCompletion);
Ich möchte, dass der Fortsetzungs-Task ausgeführt wird, wenn der Task einen Fehler aufweist oder abgebrochen wurde, aber nicht, wenn er ordnungsgemäß ausgeführt wurde. Die Fortsetzung wird nie ausgeführt.
Später fängt mein Programm eine AggregateException ab, die eine TaskCanceledException umschließt.
Meine andere Hauptinteraktion mit meinen Aufgaben besteht darin, WaitAny (taskArray, timeout) aufzurufen, bis ich keine weiteren Aufgaben mehr zu starten habe, und WaitAll dann ohne Zeitlimit aufzurufen, bis die letzte Aufgabe erledigt ist.
Könnte WaitAny mit einem Timeout einen Abbruch verursachen? Warum wurde meine Fortsetzung nicht aufgerufen?
Dies ist nur mein zweiter Pinsel mit der Task-Bibliothek, daher bin ich ahnungslos.
AKTUALISIEREN:
Ich fand diese SO-Frage: Wie übertrage ich den Status einer abgebrochenen Aufgabe auf eine Fortsetzungsaufgabe? Ein Fehler in meinem obigen Code (aber nicht der Grund für den Abbruch) ist, dass ich davon ausgegangen bin, dass der Status der Fortsetzungsaufgaben mit dem Status der ursprünglichen Aufgabe übereinstimmt. Tatsächlich muss man einige Arbeit machen, um das eine vom anderen zu bekommen, wie der andere Beitrag beschreibt.
UPDATE 2:
Brian: Danke für die Dokumentation. Ich hatte hoch und niedrig nach alternativen Ursachen für den Abbruch einer Aufgabe gesucht, jedoch die folgenden Wörter übersehen:
"Wenn Sie auf eine Aufgabe warten, die in den Status Abgebrochen übergeht, wird eine Aufgabe (in eine AggregateException eingeschlossen) erstellt und ausgelöst. Beachten Sie, dass diese Ausnahme einen erfolgreichen Abbruch anstelle einer fehlerhaften Situation anzeigt. Daher gibt die Exception-Eigenschaft der Aufgabe null zurück. "