Если вы создаете задание, и вы никогда не вызываете task.Wait()
или не пытаетесь получить результат Task<T>
, когда задание будет собрано сборщиком мусора, оно разрушит ваше приложение во время финализации.Подробнее см. На странице MSDN Обработка исключений в TPL .
. Лучший вариант здесь - «обработать» исключение.Это можно сделать с помощью продолжения - вы можете прикрепить продолжение к задаче и зарегистрировать / проглотить / и т.д. возникшее исключение.Это обеспечивает чистый способ регистрации исключений задач и может быть записан как простой метод расширения, например:
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);
}
С помощью вышеизложенного вы можете предотвратить срыв приложения и его запись в любую задачу,через:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
Кроме того, вы можете подписаться на TaskScheduler.UnobservedTaskException и обработать его там.