Я наткнулся на это, имея в виду тот же вопрос, но после прочтения ответов вопрос, кажется, задерживается, смущенный ссылками на «магию под капотом».
Из вышеупомянутого асинхронного программирования :
async
Ключевое слово превращает метод в качестве метода асинхронного, что позволяет использовать await
ключевое слово в своем теле.
- Когда
await
ключевое слово применяется, оно приостанавливает вызывающий метод и возвращает управление своему вызывающему, пока ожидаемая задача не будет завершена.
await
может использоваться только внутри async
метода.
Блокируется ли контекст, с которым вы сталкиваетесь await
?
- Да . По сути, это локальный барьер синхронизации для поддержания известного состояния в контексте выполнения; за исключением того, что другие контексты, если таковые имеются, не объединены.
Остальная часть приложения блокируется на await
?
Это зависит от того, как написано ваше заявление. Если это серия зависимых await
задач ed, запущенных последовательно в одном и том же контексте (см. « Попытка понять некоторое поведение асинхронности / ожидания» )
await asyncCall1();
await asyncCall2(); // waits for asyncCall1() to complete
таким образом, каждый из них await
будет блокировать порождение следующего.
С другой стороны, те же зависимые задачи, запускаемые параллельно, будут выполняться параллельно, и контекст будет блокироваться только в соотв. await
:
Task<int> t1 = asyncCall1();
Task<string> t2 = asyncCall2(); // runs in parallel with asyncCall1()
int val = await t1;
string str = await t2; // waits for asyncCall1() to complete
В общем случае await
приводит к выполнению внешнего контекста, из которого вызывается текущий контекст. Однако, если внешний контекст сам ожидает ток, он похож на последовательные await
s в том же контексте.
Таким образом, чтобы воспользоваться async
преимуществами, необходимо спроектировать приложение для запуска нескольких параллельных контекстов (пользовательский интерфейс, клиент данных и т. Д.), А затем await
в одном контексте выполнить выполнение в других контекстах, чтобы все приложение не блокировалось для отдельного человека await
.