Если вы создаете задачу и никогда не вызываете task.Wait()
и не пытаетесь получить результат a 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 и обработать его там.
Off
создайте статический метод-заглушку в классе, названном четырехбуквенным словом по вашему выбору, и используйте его для своих обобщающих продолжений. Помогает бороться с неудовлетворением, вызванным этим конкретным исключением.