Ich möchte darauf warten, AggregateException auszulösen, nicht nur die erste Ausnahme

Wenn auf eine fehlerhafte Aufgabe gewartet wird (eine, für die eine Ausnahme festgelegt wurde),await löst die gespeicherte Ausnahme erneut aus. Wenn die gespeicherte Ausnahme eineAggregateException es wird den ersten erneut werfen und den Rest wegwerfen.

Wie können wir verwendenawait und gleichzeitig das Original werfenAggregateException damit wir nicht versehentlich fehlerinformationen verlieren?

Beachten Sie, dass es natürlich möglich ist, sich hackige Lösungen dafür auszudenken (z. B. "Try-Catch" um das Problem herum)await, Dann ruf anTask.Wait). Ich möchte wirklich eine saubere Lösung finden.Was ist die beste Vorgehensweise hier?

Ich dachte daran, einen benutzerdefinierten Kellner zu verwenden, aber den eingebautenTaskAwaiter enthält viel Magie, von der ich nicht sicher bin, wie ich sie vollständig reproduzieren soll. Es ruft interne APIs für TPL-Typen auf. Ich mache auch nichtwollen all das zu reproduzieren.

Hier ist ein kurzer Repro, wenn du damit spielen willst:

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); });
}

Nur eine der beiden Ausnahmen wird geworfenRun.

Beachten Sie, dass andere Fragen zum Stapelüberlauf dieses spezielle Problem nicht lösen. Bitte seien Sie vorsichtig, wenn Sie Duplikate vorschlagen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage