Kto anulował moje zadanie?
Moje C # Zadanie jest anulowane, ale nie przeze mnie. Nie dostaję stacktrace i nie wiem, gdzie występuje problem.
Moje wywołanie zadania wygląda tak:
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);
Chcę, aby zadanie kontynuacji zostało uruchomione, jeśli zadanie zawiodło lub zostało anulowane, ale nie, jeśli działało prawidłowo. Kontynuacja nigdy nie jest wykonywana.
Później mój program przechwytuje wyjątek AggregateException, który zawija TaskCanceledException.
Moją inną główną interakcją z moimi zadaniami jest wywołanie WaitAny (taskArray, timeout), dopóki nie będę miał więcej zadań do uruchomienia, a następnie wywołam WaitAll bez limitu czasu, aż do wykonania ostatniego zadania.
Czy WaitAny z limitem czasu może spowodować anulowanie? Dlaczego moja kontynuacja nie została wywołana?
To tylko mój drugi pędzel z biblioteką zadań, więc nie mam pojęcia.
AKTUALIZACJA:
Znalazłem to pytanie SO: Jak propagować status Anulowanego zadania do zadania kontynuacji. Jednym z błędów w moim kodzie powyżej (ale nie przyczyną anulowania) jest założenie, że status zadań kontynuacji był taki sam jak status oryginalnego zadania. W rzeczywistości musisz zrobić trochę pracy, aby uzyskać jeden od drugiego, jak opisuje to drugi post.
AKTUALIZACJA 2:
Brian: Dzięki za odniesienie do dokumentu. Szukałem wysoko i nisko, szukając alternatywnych przyczyn anulowania Zadania, ale przegapiłem te słowa:
„Jeśli oczekujesz na Zadanie, które przechodzi do stanu Anulowane, zostanie wygenerowane i wygenerowane zadanie (zawinięte w wyjątek AggregateException) .Należy zauważyć, że wyjątek ten wskazuje pomyślne anulowanie zamiast błędnej sytuacji, dlatego właściwość wyjątku zadania zwraca wartość null. „