Задача запускается и выполняет некоторые действия. В какой-то момент эта задача может понадобиться другой для обработки данных, которые текущая задача не может обрабатывать сама по себе. Поэтому я жду, чтобы убедиться, что текущая задача не будет продолжаться до тех пор, пока у него нет результата вспомогательной задачи. Но что произойдет, если хелпер не сработает? Будет ли текущая задача оставаться заблокированной?
Основная идея позади async
и await
является то, что асинхронный код работает примерно так же, как синхронный код.
Так что, если у вас есть синхронное такой код:
void HelperMethod()
{
throw new InvalidOperationException("test");
}
void DoStuff()
{
HelperMethod();
}
тогда можно было бы ожидать DoStuff
распространять InvalidOperationException
от вспомогательного метода. Кроме того, это то, что происходит с асинхронным кодом:
async Task HelperMethodAsync()
{
throw new InvalidOperationException("test");
}
async Task DoStuffAsync()
{
await HelperMethodAsync();
}
То есть, DoStuffAsync
также будет распространяться на InvalidOperationException
.
Теперь он не работает точно точно так же, конечно, так как он должен быть асинхронными, но общая идея состоит в том, что все ваши управления потоком, такие как try
/catch
, for
петли и т.д., все " просто работать "для асинхронного кода очень похоже на синхронный код.
Что фактически происходит в том, что, когда HelperMethod
заканчивается InvalidOperationException
, исключение перехватывается и помещен на возвращаемом Task
, и задача выполнена. Когда await
в DoStuffAsync
видит, что задача завершена, она рассматривает свои исключения и повторно поднимает первый (в этом случае есть только один, InvalidOperationException
). И он повторно повышает его таким образом, который сохраняет стек вызовов в исключении. Это, в свою очередь, приводит к тому, что Task
, возвращенный с DoStuffAsync
, должен быть завершен с тем же исключением.
Таким образом, под одеялом async
и await
делают немного работы, чтобы убедиться, что вы можете просто вызывать другие методы с await
и использовать try
/catch
точно так же, как если бы в синхронном коде. Но большую часть времени вам не нужно об этом знать.
Как насчет написания простого тестового кода и просмотра результата? –
Вы не можете «ждать» 'Result', вы можете подождать задание. Если он провалился, он выкинет исключение –
Конечно, я мог бы написать тестовый код, но это займет гораздо больше времени, чем спрашивать здесь. И это не должно быть слишком много усилий, чтобы ответить на это :) В противном случае мне очень жаль. Извините, моя вина. Конечно, я имел в виду ждать задания. Итак, теоретически «ожидание» выдает исключение, если ожидаемая задача не выполняется? – SharpShade