Jeśli utworzysz zadanie i nigdy nie zadzwonisz task.Wait()
ani nie spróbujesz pobrać wyniku a Task<T>
, gdy zadanie jest zbierane przez moduł odśmiecania pamięci, zburzy to aplikację podczas finalizacji. Aby uzyskać szczegółowe informacje, zobacz stronę MSDN dotyczącą obsługi wyjątków w TPL .
Najlepszą opcją jest „obsłużenie” wyjątku. Można to zrobić poprzez kontynuację - możesz dołączyć kontynuację do zadania i zarejestrować / połknąć / itp. Wyjątek, który wystąpił. Zapewnia to czysty sposób rejestrowania wyjątków zadań i można go zapisać 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);
}
W ten sposób możesz zapobiec zniszczeniu aplikacji i zarejestrowaniu jej przez jakiekolwiek zadanie poprzez:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
Alternatywnie możesz zasubskrybować TaskScheduler.UnobservedTaskException i tam go obsłużyć.
Off
użyj statycznej metody pośredniczącej w klasie nazwanej jako wybrane czteroliterowe słowo i używaj jej do kontynuacji typu catch-all. Pomaga zwalczyć stłumioną frustrację wynikającą z tego szczególnego wyjątku.