Я наткнувся на це з тим же запитанням на увазі, але, прочитавши відповіді, питання, здається, затрималося, переплутане посиланнями на "магію під кришкою".
З вищезазначеного асинхронного програмування :
- The
async
Ключове слово перетворює метод як метод асинхронного, що дозволяє використовувати await
ключове слово в своєму тілі.
- Коли
await
ключове слово застосовано, воно призупиняє метод виклику і повертає контроль своєму абоненту до завершення очікуваного завдання.
await
може використовуватися лише всередині async
методу.
Чи await
заблокований контекст, який зустрічається ?
- Так . Це по суті локальний бар'єр синхронізації для підтримання відомого стану в контексті виконання; за винятком того, що інші контексти, якщо такі є, не приєднуються.
Чи блокується решта програми на await
?
Це залежить від того, як написана ваша заява. Якщо це ряд залежних await
завдань редагування, що запускаються послідовно в одному контексті (див.: Спроба зрозуміти деяку поведінку асинхронізації / очікування )
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
.