При ожидании неудачной задачи (той, которая имеет набор исключений) await
будет отменять сохраненное исключение. Если хранимое исключение - это AggregateException
, оно отменяет первое и отменяет остальные.
Как мы можем использовать await
и в то же время бросать исходный AggregateException
, чтобы мы не случайно теряли информацию об ошибке?
Обратите внимание, что, конечно, можно подумать о взломанных решениях для этого (например, try-catch вокруг await
, а затем вызвать Task.Wait
). Я действительно хочу найти чистое решение. Что такое лучшая практика здесь?
Я думал об использовании пользовательского awaiter, но встроенный TaskAwaiter
содержит много магии, что я не уверен, как полностью воспроизвести. Он вызывает внутренние API-интерфейсы типов TPL. Я также не хочу воспроизводить все это.
Вот короткое воспроизведение, если вы хотите сыграть с ним:
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); });
}
Только одно из двух исключений выбрано в Run
.
Обратите внимание, что другие вопросы о переполнении стека не адресуют эту конкретную проблему. Будьте осторожны, предлагая дубликаты.