2014-02-08 4 views
8

Я пытаюсь понять, что происходит с исключениями, которые выбрасываются в объект задачи и никогда не обрабатываются.Задание необработанных исключений

На MSDN сказано, что:

Если вы не ждете от задачи, которая распространяется исключение, или доступ его собственности Исключение, исключение перерос в соответствии с политикой .NET исключение, когда задача сбора мусора.

Поэтому я не совсем понимаю, каким образом эти исключения влияют на ход программы. Я думал, что эти исключения должны прерывать выполнение, как только они собираются в мусор. Но я не могу создать такое поведение. В следующем фрагменте исключенное исключение не отображается.

\\Do something ... 
Task.Run (()=> {throw new Exception("Exception in the task!");}); 
\\Do something else 

Пожалуйста, объясните, как обрабатывается необработанное задание, и как они влияют на поток программы.

+0

Посмотрите здесь http://msdn.microsoft.com/en-us/library/dd537614(v=vs.110).aspx – techno

+1

[Это поможет] (http://stackoverflow.com/ вопросы/8803107/task-and-exception-silence? rq = 1) –

+0

@SriramSakthivel спасибо, не очень подробный, но полезный. – user3101007

ответ

18

Вы описываете поведение, так как оно было в .NET 4, но вам будет сложно заставить сбор мусора и фактически наблюдать за этим поведением. Следующая цитата из Stephen Toub's excelent write-up по этому вопросу должны сделать его еще более ясно: «наблюдается»

Задачи отслеживать ли необработанное исключение было В этом контексте «наблюдается» означает, что код присоединился с Задача в некотором роде, чтобы, по крайней мере, узнать об исключении . Это может вызвать Wait/WaitAll в Задаче. Это может проверять свойство Исключения задачи после завершения задачи . Или он может использовать свойство результата Задачи. Если задание видит, что его исключение наблюдалось в некотором роде, жизнь хороша. Если, однако, все ссылки на задачу удалены (что делает задачу доступной для сбора мусора), и если ее исключение еще не было обнаружено, Задача знает, что его исключение никогда не будет наблюдаться. В этом случае Задача использует завершение и использует вспомогательный объект для распространения необработанного исключения в потоке финализатора. С ранее описанным поведением это исключение в потоке финализатора будет обработано без обработки, а вызовет необработанную логику исключения по умолчанию, которая предназначена для регистрации проблемы и сбоя процесса.

Он также предложил два полезных метода расширения для обработки исключений в «огонь и забыть» задачи: один игнорируя исключение, а другой сразу сбой процесса:

public static Task IgnoreExceptions(this Task task) 
{ 
    task.ContinueWith(c => { var ignored = c.Exception; }, 
     TaskContinuationOptions.OnlyOnFaulted | 
     TaskContinuationOptions.ExecuteSynchronously | 
     TaskContinuationOptions.DetachedFromParent); 
    return task; 
} 

public static Task FailFastOnException(this Task task) 
{ 
    task.ContinueWith(c => Environment.FailFast(“Task faulted”, c.Exception), 
     TaskContinuationOptions.OnlyOnFaulted | 
     TaskContinuationOptions.ExecuteSynchronously | 
     TaskContinuationOptions.DetachedFromParent); 
    return task; 
} 

В .NET 4.5 поведение по умолчанию изменилось. Опять же, цитата из another Stephen Toub's post on the subject (спасибо Майку г для приведения его к моему вниманию в комментариях):

Для того, чтобы облегчить разработчикам писать асинхронный код на основе Задачи, .NET 4.5 изменяет исключение по умолчанию поведение для ненаблюдаемых исключений .В то время как незаметные исключения будут по-прежнему вызывать событие UnobservedTaskException (это не будет нарушение), процесс по умолчанию не завершится. Скорее, исключение в конечном итоге будет съедено после того, как событие будет поднято, независимо от того, наблюдает ли обработчик события исключение. Возможно, это поведение .

+0

Спасибо за подробный ответ. – user3101007

+3

Хотя это правильно для .NET 4, в .NET 4.5 политика была изменена, чтобы игнорировать незаметные исключения задачи. –

+0

@mikez Спасибо, что привлекли его к моему вниманию. Я отредактировал ответ соответственно. –

Смежные вопросы