Сегодня мы с моими коллегами обсуждали, как правильно обрабатывать исключения в С# 5.0 async
, и мы задавались вопросом, не ожидает ли в ожидании сразу нескольких задач исключения, которые не распаковываются средой выполнения.
Рассмотрим следующий фрагмент кода:
async Task ExceptionMethodAsync()
{
await Task.Yield();
throw new Exception();
}
async Task CallingMethod()
{
try
{
var a = ExceptionMethodAsync();
var b = ExceptionMethodAsync();
await Task.WhenAll(a, b);
}
catch(Exception ex)
{
// Catches the "first" exception thrown (whatever "first" means)
}
}
Что происходит со второй задачей сейчас? Оба будут в неисправном состоянии, но второе исключение задачи теперь наблюдается или ненаблюдается?