181 votes

Pourquoi await sur Task.WhenAll ne lève-t-il pas une AggregateException ?

Dans ce code :

private async void button1_Click(object sender, EventArgs e) {
    try {
        await Task.WhenAll(DoLongThingAsyncEx1(), DoLongThingAsyncEx2());
    }
    catch (Exception ex) {
        // Expect AggregateException, but got InvalidTimeZoneException
    }
}

Task DoLongThingAsyncEx1() {
    return Task.Run(() => { throw new InvalidTimeZoneException(); });
}

Task DoLongThingAsyncEx2() {
    return Task.Run(() => { throw new InvalidOperation();});
}

Je m'attendais WhenAll pour créer et lancer un AggregateException car au moins une des tâches qu'il attendait a déclenché une exception. Au lieu de cela, je reçois une seule exception lancée par l'une des tâches.

Fait WhenAll ne crée pas toujours un AggregateException ?

11voto

Mohit Datta Points 151

Vous pensez à Task.WaitAll - il lance un AggregateException .

WhenAll lance simplement la première exception de la liste des exceptions qu'il rencontre.

4voto

LionSoft Points 416

Essayez ce modèle de code :

Task task = null;
try
{
    task = Task.WhenAll(...);
    await task;
 }
 catch
 {
     var aggException = task.Exception;
     ...
 }

-4voto

Nebula Points 11

Dans votre code, la première exception est renvoyée par conception, comme expliqué à l'adresse suivante http://blogs.msdn.com/b/pfxteam/archive/2011/09/28/task-exception-handling-in-net-4-5.aspx

Pour répondre à votre question, vous obtiendrez une AggreateException si vous écrivez un code comme celui-ci :

try {
    var result = Task.WhenAll(DoLongThingAsyncEx1(), DoLongThingAsyncEx2()).Result; 
}
catch (Exception ex) {
    // Expect AggregateException here
}

-4voto

Alexey Kulikov Points 1069

Cela fonctionne pour moi

private async Task WhenAllWithExceptions(params Task[] tasks)
{
    var result = await Task.WhenAll(tasks);
    if (result.IsFaulted)
    {
                throw result.Exception;
    }
}

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