Si vous créez une Tâche, et vous ne jamais appeler task.Wait()
ou d'essayer de récupérer le résultat d'un Task<T>
, lorsque la tâche est recueilli par le garbage collector, il va déchirer vers le bas de votre application en cours de finalisation. Pour plus de détails, consultez MSDN page sur la gestion des exceptions dans le TPL.
La meilleure option ici est de "gérer" l'exception à la règle. Cela peut être fait par l'intermédiaire d'une poursuite - vous pouvez joindre une continuation de la tâche, et log/avaler/etc l'exception qui se produit. Cela fournit un moyen propre de journal de tâche exceptions, et peut être écrite comme une simple extension de la méthode, c'est à dire:
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);
}
Ci-dessus, vous pouvez éviter toute tâche de démolir l'application et à l'enregistrement, par l'intermédiaire de:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
Alternativement, vous pouvez vous abonner à la TaskScheduler.UnobservedTaskException et de les traiter.