Je veux vous attendent afin de jeter AggregateException, pas seulement la première Exception

Lors de l'attente d'une reproché à la tâche (celui qui a une exception), await va renvoyer la stockées exception. Si la réserve d'exception est un AggregateException il va renvoyer le premier et jeter le reste.

Comment pouvons-nous utiliser await et en même temps jeter l'original AggregateException de façon à ne pas perdre accidentellement les informations d'erreur?

Noter qu'il est bien sûr possible de penser hacky solutions pour cela (par exemple try-catch autour de la await, puis d'appeler Task.Wait). Je vous souhaite vraiment de trouver une solution propre. Quelle est la meilleure pratique ici?

Je pensais de l'aide personnalisé awaiter mais le haut- TaskAwaiter contient beaucoup de magie que je ne suis pas sûr de la façon de reproduire intégralement. Il appelle interne de l'Api sur les TPL types. Je n'ai pas non voulez de reproduire tout cela.

Voici une petite repro si vous voulez jouer avec elle:

static void Main()
{
    Run().Wait();
}

static async Task Run()
{
    Task[] tasks = new[] { CreateTask("ex1"), CreateTask("ex2") };
    await Task.WhenAll(tasks);
}

static Task CreateTask(string message)
{
    return Task.Factory.StartNew(() => { throw new Exception(message); });
}

Seulement l'une des deux exceptions sont jetés dans Run.

Noter, que d'autres questions sur un Débordement de Pile à ne pas traiter de ce problème spécifique. Soyez prudent lors de l'suggérant des doublons.

  • Avez-vous vu cette entrée de blog expliquant pourquoi ils ont choisi de mettre en œuvre la gestion des exceptions pour await comme ils l'ont fait? blogs.msdn.com/b/pfxteam/archive/2011/09/28/10217876.aspx
  • Oui, merci. J'ai un peu d'accord avec ce raisonnement pour le cas général, mais mon cas d'utilisation n'est pas couverte.
  • "Dans tous les cas, la Tâche de l'Exception de la propriété renvoie toujours une AggregateException qui contient toutes les exceptions, de sorte que vous pouvez attraper quel est lancée et revenir pour consulter la Tâche.Exception en cas de besoin."
InformationsquelleAutor usr | 2013-08-19