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..Net 4.0
. O tratamento de exceção foi alterado por padrão.net 4.5
para não destruir o aplicativo . Veja mais em Manipulação de exceções de tarefas em .NET 4.5Certo; significa que
Task
foi finalizado após ser deixado para a coleta de lixo, mas a tarefa em si falhou. Existem duas soluções:ContinueWith(...)
para se inscrever e verificar.IsFaulted
e.Exception
noTask
parâmetro)TaskScheduler.UnobservedTaskException
evento e marcá-lo como observado (chamare.SetObserved()
após registrar o erro)fonte
IsFaulted
, você pode usar aOnlyOnFaulted
opção de continuação e evitar a verificação manual ...SetObserved
emUnobservedTaskExceptionEventArgs
necessidades a ser chamado.Tente este:
fonte