Se você criar uma Tarefa e nunca chamar task.Wait()
ou tentar recuperar o resultado de uma Task<T>
, quando a tarefa for coletada pelo coletor de lixo, seu aplicativo será interrompido durante a finalização. Para obter detalhes, consulte a página do MSDN sobre Tratamento de exceções na TPL .
A melhor opção aqui é "lidar" com a exceção. Isso pode ser feito por meio de uma continuação - você pode anexar uma continuação à tarefa e registrar / engolir / etc a exceção que ocorrer. Isso fornece uma maneira limpa de registrar exceções de tarefa e pode ser escrito como um método de extensão simples, ou seja:
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);
}
Com o exposto acima, você pode evitar que qualquer tarefa destrua o aplicativo e registre-o através de:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
Como alternativa, você pode se inscrever em TaskScheduler.UnobservedTaskException e lidar com isso lá.
Off
em uma classe chamada como a palavra de quatro letras de sua escolha e use-o para suas continuações abrangentes. Ajuda a combater parte da frustração reprimida dessa exceção em particular.