Путаница с обработкой исключений Async/AwaitC#

Место общения программистов C#
Ответить
Anonymous
 Путаница с обработкой исключений Async/Await

Сообщение Anonymous »

Я пытаюсь понять async/await в .net8, особенно обработку исключений, и у меня возникла некоторая путаница, особенно в отношении документации, поскольку, хотя она и определяет некоторые подходы, она не дает мне достаточно примеров понять, что происходит.
Я использую следующий тривиальный код, чтобы посмотреть, что что-то работает:

Код: Выделить всё

private static async Task Main(string[] args) {
var sleeps = new int[] { 1, 2, 3, 0 };
var tasks = new List();
foreach (var t in sleeps)
{
Console.WriteLine("Submitting task: {0}", t);
tasks.Add(sleep(t));
}
Console.WriteLine("All tasks submitted, waiting for all to complete");
try
{
Task.WaitAll(tasks.ToArray());
} catch (DivideByZeroException e)
{
Console.WriteLine("One of the tasks failed: {0}", e);
}
Console.WriteLine("All tasks completed, collecting results");
foreach (var t in tasks)
{
Console.WriteLine("Task returned: {0}", t.Result);
}
}

private static async Task sleep(int s)
{
Console.WriteLine("Sleeping for: [ {0} ]", s);
if (s == 0)
{
// this is just to throw something to be caught
throw new DivideByZeroException("0 can't be delayed");
}
await Task.Delay(s * 1000);
Console.WriteLine("\tSlept for: [ {0} ]", s);
return s;
}
Я следую документации отсюда:
  • ​Асинхронное программирование с использованием async и await – асинхронные исключения
и здесь:
  • Создание и выдача исключений — Исключения в методах, возвращающих задачи.< /li>
Согласно документации, я должен попытаться генерировать исключения в моих асинхронных функциях ПЕРЕД вводом асинхронной части кода. Как вы можете видеть в моем примере, я выдаю исключение ZeroDivision перед ожиданием Task.Delay.
Когда я запускаю этот код в Visual Studio, я ожидаю, что произойдет исключение DivideByZeroException. catch, но вместо этого я получаю SystemAggregateException, который, как я понимаю, заключается в том, как .net собирает все асинхронные исключения, однако в документации явно указано: когда код ожидает ошибочную задачу, первое исключение в коллекции AggregateException.InnerExceptions генерируется повторно. Однако я вообще не получаю исключение DivideByZero, вместо этого я получаю два исключения SystemAggregate, каждое из которых выдается последовательно, причем первое внутреннее исключение является исключением DivideByZero.
Что здесь происходит.< /p>
Я также закодировал здесь пример завтрака: Асинхронное программирование с async и await и добавил горящий тостер, что еще больше сбивает с толку, поскольку я НЕ получаю нигде исключения, когда я явно бросить один. Я должен проверить Task.Exception, чтобы увидеть, было ли оно выбрано.
Так может ли кто-нибудь объяснить, что здесь происходит?
Что какой подход я бы использовал, если бы хотел отправить 5 асинхронных задач, дождаться завершения всех из них, а затем перебрать их, чтобы проверить их свойства Result или Exception? Я не понимаю, когда пробовать/перехватывать, когда проверять Task.Exception и почему я получаю исключения SystemAggregate в моем примере кода.

Подробнее здесь: https://stackoverflow.com/questions/785 ... -confusion
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»