Я наткнувся на це з тим же запитанням на увазі, але, прочитавши відповіді, питання, здається, затрималося, переплутане посиланнями на "магію під кришкою".
З вищезазначеного асинхронного програмування :
- 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приносить виконання зовнішньому контексту, звідки викликається поточний контекст. Однак якщо зовнішній контекст сам чекає на поточний, то це як послідовний awaits у тому ж контексті.
Отже, щоб скористатись asyncперевагами, потрібно розробити додаток для запуску декількох паралельних контекстів (інтерфейс користувача, клієнт даних тощо), тоді awaitв одному контексті приводиться до виконання інших контекстів, так що вся програма не блокується для окремої людини await.