Chcę poczekać na rzucenie AggregateException, a nie tylko na pierwszy wyjątek

Podczas oczekiwania na zadanie z błędem (takie, które ma zestaw wyjątków),await powtórzy zapisany wyjątek. Jeśli przechowywany wyjątek toAggregateException przewróci pierwszy i odrzuci resztę.

Jak możemy korzystaćawait a jednocześnie rzucić oryginałAggregateException abyśmy przypadkowo nie utracili informacji o błędzie?

Należy zauważyć, że oczywiście możliwe jest wymyślenie hackich rozwiązań w tym zakresie (np. Spróbuj złapać wokołoawait, Wtedy zadzwońTask.Wait). Naprawdę chcę znaleźć czyste rozwiązanie.Jaka jest tutaj najlepsza praktyka?

Myślałem o użyciu niestandardowego kelnera, ale wbudowanegoTaskAwaiter zawiera dużo magii, której nie jestem pewien, jak w pełni odtworzyć. Wywołuje wewnętrzne API na typach TPL. ja także niechcieć odtworzyć to wszystko.

Oto krótki repro, jeśli chcesz się nim bawić:

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

Tylko jeden z dwóch wyjątków jest wrzucanyRun.

Zauważ, że inne pytania dotyczące przepełnienia stosu nie rozwiązują tego konkretnego problemu. Uważaj, sugerując duplikaty.

questionAnswers(4)

yourAnswerToTheQuestion