Disons que j'ai eu le code suivant: Comment savoir quelle tâche a jeté quelle tâche a lancé laquelle des exceptions dans exception.innerexceptions p>? p>? P> p>
4 Réponses :
Vous avez toujours la liste des tâches Mais, si vous le pouvez, il serait préférable d'utiliser code>, et chaque référence
code> a une propriété
exception code>. En utilisant cela, vous pouvez déterminer quelles exceptions appartiennent à la tâche
code>. P>
Tâche.Lqus code> ou
TaskFactory.Continuewhenall code> que faire une attente de blocage. P>
N'est-ce pas chacun Tâche.Exception a > Pointant vers la même exception AggregateException code> transmise à
attraper code>?
Non, chaque tâche code> n'est pas au courant des autres tâches et elle n'aura que sa propre exception.
J'ai une bonne raison d'attendre tous. Mais je suppose que cette information est bonne pour les autres. C'est un peu bizarre que l'exception par elle-même ne peut pas identifier quelle tâche a échoué car elle peut être une tâche enfant qui a échoué à l'origine.
@jgauffin, plusieurs fois, vous pouvez utiliser attendre lorsqueall code> au lieu de
waitall code>.
var throwers = tasks.Where(task => task.Exception != null);
Quelques tâches ont peut-être été levées et leurs exceptions sont agrégées dans une seule AggregateException Code>, AFAIK
@Noseratio Les lanceurs code> ci-dessus est une séquence de toutes les tâches que a fait i> 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.
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."); } } });
Option1 (Crédit à @ Theodor-Zoulias Commentaire):
Vous pouvez définir la propriété Si cela ne vous dérange pas de perdre le nom des informations d'assemblage de l'exception, vous pouvez définir la exception.data code> avec le nom de la tâche: p>
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}");
}
}
exception.Source code> < / a> La propriété est destinée à fournir des informations sur l'assemblage dans lequel l'exception est originaire. Vous perdez des informations en détournant cette propriété. Pour info définie par l'utilisateur, il est préférable d'utiliser
Exception .Data code>
propriété.
Les données code> code> est un identificateur code> code>, donc je ne pense pas que votre code mis à jour compile.