Если вы создаете задачу и никогда не вызываете 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
создайте статический метод-заглушку в классе, названном четырехбуквенным словом по вашему выбору, и используйте его для своих обобщающих продолжений. Помогает бороться с неудовлетворением, вызванным этим конкретным исключением..Net 4.0
. Обработка исключений была изменена по умолчанию,.net 4.5
чтобы не разрушать приложение . Дополнительные сведения см. В разделе « Обработка исключений задач в .NET 4.5»Конечно; это означает, что объект
Task
был завершен после того, как был оставлен на сборку мусора, но сама задача не удалась. Есть два исправления:ContinueWith(...)
для подписки, а также проверить.IsFaulted
и.Exception
наTask
в параметре)TaskScheduler.UnobservedTaskException
событие и отметить его как наблюдаемое (вызватьe.SetObserved()
после регистрации ошибки)источник
IsFaulted
, вы можете использоватьOnlyOnFaulted
вариант продолжения и избежать ручной проверки ...SetObserved
наUnobservedTaskExceptionEventArgs
нужды называть.Попробуй это:
источник