Jeśli tworzysz zadanie, a nie zawsze zadzwonić task.Wait()
lub próbować odzyskać jego wynik Task<T>
, gdy zadanie zostanie zebrane przez odśmiecacz, zerwie twoje podanie podczas finalizacji. Szczegółowe informacje można znaleźć na stronie MSDN pod adresem Exception Handling in the TPL.
Najlepszym rozwiązaniem jest "obsłużyć" wyjątek. Można to zrobić poprzez kontynuację - możesz dołączyć kontynuację do zadania i zalogować/połknąć/etc wyjątek, który występuje. To zapewnia czystą drogę do logowania wyjątki zadanie i może być zapisany jako prostą metodę rozszerzenia, tj:
public static void LogExceptions(this Task task)
{
task.ContinueWith(t =>
{
var aggException = t.Exception.Flatten();
foreach(var exception in aggException.InnerExceptions)
LogException(exception);
},
TaskContinuationOptions.OnlyOnFaulted);
}
Z powyższego można uniknąć zadanie z burząc aplikację i zaloguj się poprzez:
Task.Factory.StartNew(() =>
{
// Do your work...
}).LogExceptions();
Można również subskrybować numer TaskScheduler.UnobservedTaskException i obsługiwać go.
Dla dodana rozrywka, użyj statycznej metody krótkiej "Off" w klasie o nazwie czteroliterowej i wybierz ją dla swoich kontynuacji catch-all. Pomaga zwalczyć niektóre z nagromadzonej frustracji z tego szczególnego wyjątku. – Aaronaught
faktycznie tak się stało, gdy nazwałem publiczną funkcję statyczną wewnątrz zadania tpl. użycie catch-u spróbować rozwiązałoby ten problem? czy naprawdę muszę stworzyć kolejne zadanie i czekać? – MonsterMMORPG
@MonsterMMORPG: Funkcja catch catch wewnątrz funkcji (public static), która wychwyciła wyjątek, poradziłaby sobie z tym. Problem polega na tym, że wyjątek jest "bulgotaniem" do samego zadania, a ty nigdy nie czekasz na wykonanie zadania. Jeśli to zrobisz, naprawi to. –