Si vous créez une tâche et que vous n'appelez task.Wait()
ou n'essayez jamais de récupérer le résultat d'un Task<T>
, lorsque la tâche est collectée par le garbage collector, votre application sera détruite lors de la finalisation. Pour plus de détails, consultez la page MSDN sur la gestion des exceptions dans le TPL .
La meilleure option ici est de "gérer" l'exception. Cela peut être fait via une continuation - vous pouvez attacher une continuation à la tâche et enregistrer / avaler / etc l'exception qui se produit. Cela fournit un moyen propre de consigner les exceptions de tâches et peut être écrit comme une simple méthode d'extension, 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);
}
Avec ce qui précède, vous pouvez empêcher toute tâche de détruire l'application et de la journaliser via:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
Vous pouvez également vous abonner à l' exception TaskScheduler.UnobservedTaskException et la gérer à cet endroit .
Off
utilisez une méthode stub statique dans une classe nommée comme le mot de quatre lettres de votre choix et utilisez-la pour vos continuations fourre-tout. Aide à combattre une partie de la frustration refoulée de cette exception particulière..Net 4.0
. La gestion des exceptions a été modifiée par défaut.net 4.5
pour ne pas détruire l'application . Voir plus dans Gestion des exceptions de tâches dans .NET 4.5Sûr; cela signifie qu'un a
Task
été finalisé après avoir été laissé au garbage collection, mais la tâche elle-même a échoué. Il existe deux correctifs:ContinueWith(...)
pour vous abonner et vérifier.IsFaulted
et.Exception
sur leTask
dans le paramètre)TaskScheduler.UnobservedTaskException
événement et le marquer comme observé (appele.SetObserved()
après avoir enregistré l'erreur)la source
IsFaulted
, vous pouvez utiliser l'OnlyOnFaulted
option de continuation et éviter la vérification manuelle ...SetObserved
leUnobservedTaskExceptionEventArgs
doit être appelé.Essaye celui-là:
la source