Наткнулся на этот пост, в котором говорится о создании асинхронных веб-запросов.
Не говоря уже о простоте, если в реальном мире все, что вы делаете, это делаете асинхронный запрос и ждете его в следующей строке, разве это не то же самое, что вначале выполнять вызов синхронизации?
c#
.net
asynchronous-programming
Mrchief
источник
источник
Ответы:
Нет,
async + await != sync
из-за продолженияИз MSDN «Асинхронное программирование с использованием асинхронных и ожидающих (C # и Visual Basic)»
Например, асинхронное выполнение не заблокирует поток пользовательского интерфейса и
Some TextBox.Text
будет обновлено после завершения загрузки.источник
Console.WriteLine(await GetStringOverNetwork());
? Что если вам нужен вывод асинхронного вызова? Будет ли программа блокироваться при первом доступе, даже если поток потенциально может продолжить выполнение?Нет, это не то же самое.
Ваш
async
блок кода ожидаетawait
возврата вызова, чтобы продолжить, однако остальная часть вашего приложения не ждет и все еще может продолжаться как обычно.В отличие от этого, синхронный вызов заставил бы все ваше приложение или поток ждать, пока код не завершится, чтобы продолжить работу с чем-то еще.
источник
Пожалуйста, позвольте мне прояснить вещи в отношении async / await.
Когда происходит ожидание, базовый конечный автомат позволяет немедленно вернуть управление. Затем, когда ожидаемый вызов завершен, базовый конечный автомат позволяет возобновить выполнение на линии после ожидаемого вызова.
Следовательно, асинхронный блок не блокируется и не ожидает завершения ожидаемого вызова; Управление возвращается немедленно, когда встречается команда await.
Базовый конечный автомат является частью "магии" использования асинхронного / ожидающего, который не используется и не пропущен.
источник
Я наткнулся на это, имея в виду тот же вопрос, но после прочтения ответов вопрос, кажется, задерживается, смущенный ссылками на «магию под капотом».
Из вышеупомянутого асинхронного программирования :
Блокируется ли контекст, с которым вы сталкиваетесь
await
?Остальная часть приложения блокируется на
await
?Это зависит от того, как написано ваше заявление. Если это серия зависимых
await
задач ed, запущенных последовательно в одном и том же контексте (см. « Попытка понять некоторое поведение асинхронности / ожидания» )таким образом, каждый из них
await
будет блокировать порождение следующего.С другой стороны, те же зависимые задачи, запускаемые параллельно, будут выполняться параллельно, и контекст будет блокироваться только в соотв.
await
:В общем случае
await
приводит к выполнению внешнего контекста, из которого вызывается текущий контекст. Однако, если внешний контекст сам ожидает ток, он похож на последовательныеawait
s в том же контексте.Таким образом, чтобы воспользоваться
async
преимуществами, необходимо спроектировать приложение для запуска нескольких параллельных контекстов (пользовательский интерфейс, клиент данных и т. Д.), А затемawait
в одном контексте выполнить выполнение в других контекстах, чтобы все приложение не блокировалось для отдельного человекаawait
.источник