Wait
и await
- в то время как аналогичные концептуально - фактически совершенно разные.
Wait
будет синхронно блокироваться, пока задача не завершится. Таким образом, текущий поток буквально заблокирован, ожидая завершения задачи. Как правило, вы должны использовать «async
полностью вниз»; то есть не блокируйте код async
. В моем блоге я подробно расскажу о , как блокировка в асинхронном коде вызывает deadlock .
await
будет асинхронно ждать завершения задачи. Это означает, что текущий метод «приостановлен» (его состояние зафиксировано), и метод возвращает неполную задачу своему вызывающему. Позже, когда выражение await
завершается, остальная часть метода запланирована как продолжение.
Вы также упоминали «кооперативный блок», по которому я предполагаю, что вы имеете в виду задачу, которую вы Wait
ing может выполняться на ожидающем потоке. Бывают ситуации, когда это может произойти, но это оптимизация. Существует много ситуаций, когда не может , как если бы задача была для другого планировщика, или если она уже запущена или если это некод (например, в вашем примере кода: Wait
не может выполнить задачу Delay
inline, потому что для нее нет кода).
Вы можете найти полезную async
/ await
ввод .