38 votes

L'attente d'une tâche avec une continuation OnlyOnFaulted provoque une exception AggregateException

J'ai un code simple comme une repro:

var taskTest = Task.Factory.StartNew(() =>
{
    System.Threading.Thread.Sleep(5000);

}).ContinueWith((Task t) =>
{
    Console.WriteLine("ERR");
}, TaskContinuationOptions.OnlyOnFaulted);

try
{
    Task.WaitAll(taskTest);
}
catch (AggregateException ex)
{
    foreach (var e in ex.InnerExceptions)
        Console.WriteLine(e.Message + Environment.NewLine + e.StackTrace);
}

Cependant, je suis un inattendu TaskCanceledException être levée dans le bloc try catch (c'est dans la AggregateException InnerExceptions objet). "Une tâche a été annulée".

Pourquoi ai-je cette exception? La Poursuite de la tâche se déclenche jamais, il n'y a aucune exception générée par elle, mais j'ai toujours l'agrégation d'exception lors de l'attente....

J'espère que quelqu'un peut expliquer comment tout cela fait sens pour moi :)

55voto

Jon Skeet Points 692016

Vous attendez pas une tâche avec une suite OnlyOnFaulted - vous êtes en attente sur cette suite (retourné par ContinueWith ). La suite ne sera jamais déclenchée car la tâche d'origine est revenue normalement; elle agit donc comme si elle avait été annulée.

Cela a du sens pour moi.

Je pense que vous voulez créer la tâche, ajouter la suite, mais attendre la tâche d' origine :

 var taskTest = Task.Factory.StartNew(() =>
{
    System.Threading.Thread.Sleep(5000);

});
taskTest.ContinueWith((Task t) =>
{
    Console.WriteLine("ERR");
}, TaskContinuationOptions.OnlyOnFaulted);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X