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.