6
votes

Tâche.Waittall, comment trouver les tâches causant des agrégatesception

Disons que j'ai eu le code suivant: xxx

Comment savoir quelle tâche a jeté quelle tâche a lancé laquelle des exceptions dans exception.innerexceptions ? ?


0 commentaires

4 Réponses :



2
votes
var throwers = tasks.Where(task => task.Exception != null);

2 commentaires

Quelques tâches ont peut-être été levées et leurs exceptions sont agrégées dans une seule AggregateException , AFAIK


@Noseratio Les lanceurs ci-dessus est une séquence de toutes les tâches que a fait une exception. Pourrait être tout, pourrait n'en être pas, ou pourrait être un nombre d'entre eux - mais ils ont chacun leur propre exception.



0
votes
        var t1 = Task.Factory.StartNew(() => Console.WriteLine("Task 1"));
        var t2 = Task.Factory.StartNew(() => Console.WriteLine("Task 2"));
        var t3 = Task.Factory.StartNew(() => { throw new InvalidOperationException(); });
        var t4 = Task.Factory.StartNew(() => Console.WriteLine("Task 4"));

        Task.Factory.ContinueWhenAll(new[] { t1, t2, t3, t4 }, tasks =>
            {
                foreach (var t in tasks)
                {
                    if (t.Status == TaskStatus.Faulted)
                    {
                        // this will run for t3
                        Console.WriteLine("This task has been faulted.");
                    }
                }
            });

0 commentaires

0
votes

Option1 (Crédit à @ Theodor-Zoulias Commentaire):

Vous pouvez définir la propriété exception.data ​​code> avec le nom de la tâche: p> xxx pré> Option2: P>

Si cela ne vous dérange pas de perdre le nom des informations d'assemblage de l'exception, vous pouvez définir la exception.source code> ( DOC ) Propriété de l'exception lancée basée sur la tâche Nom et regardez-le en itération: P>

var t1 = Task.Factory.StartNew(() => 
{
    throw new Exception() { Source = "t1" };
});
var t2 = Task.Factory.StartNew(() => 
{
    throw new Exception() { Source = "t2" };
});

try
{
    Task.WaitAll(t1, t2);
}
catch (AggregateException ae)
{
    foreach (var exception in ae.InnerExceptions)
    {
        Console.WriteLine($"Exception was thrown by {exception.Source}");
    }
}