Я наткнулся на это, имея в виду тот же вопрос, но после прочтения ответов вопрос, кажется, задерживается, смущенный ссылками на «магию под капотом».
Из вышеупомянутого асинхронного программирования :
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приводит к выполнению внешнего контекста, из которого вызывается текущий контекст. Однако, если внешний контекст сам ожидает ток, он похож на последовательные awaits в том же контексте.
Таким образом, чтобы воспользоваться asyncпреимуществами, необходимо спроектировать приложение для запуска нескольких параллельных контекстов (пользовательский интерфейс, клиент данных и т. Д.), А затем awaitв одном контексте выполнить выполнение в других контекстах, чтобы все приложение не блокировалось для отдельного человека await.