Я хочу дождаться, чтобы сгенерировать AggregateException, а не только первое исключение
При ожидании сбойной задачи (для которой установлено исключение),await
сбросит сохраненное исключение. Если сохраненное исключение являетсяAggregateException
оно отбросит первое и отбросит все остальное.
Как мы можем использоватьawait
и заодно киньте оригиналAggregateException
чтобы мы случайно не потеряли информацию об ошибках?
Обратите внимание, что, конечно, можно подумать о хакерских решениях для этого (например,await
затем позвонитеTask.Wait
). Я действительно хочу найти чистое решение.Какова лучшая практика здесь?
Я думал об использовании пользовательского ожидающего, но встроенный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
.
Обратите внимание, что другие вопросы по переполнению стека не решают эту конкретную проблему. Пожалуйста, будьте осторожны, предлагая дубликаты.