Предположим, я дал вам следующий рабочий процесс:
- написать записку с надписью "косить газон" и положить ее в холодильник.
- ничего не делайте, пока задача, упомянутая в примечании, не будет выполнена.
- Сделать бутерброд
- Выполняйте задания, написанные на заметках в холодильнике.
Если вы следовали этому рабочему процессу, вы переходите к шагу (2), а затем ничего не делаете навсегда, потому что вы ожидаете завершения задачи шага (1), которая не запускается до шага (4).
Вы эффективно кодируете тот же рабочий процесс в программном обеспечении, поэтому неудивительно, что вы ждете вечно.
Так почему же добавление Run
"исправляет" это? Вот еще один рабочий процесс:
- написать записку с надписью «косить газон», нанять работника и дать эту записку работнику
- абсолютно ничего не делать, пока задача, упомянутая в примечании, не будет выполнена
- Сделать бутерброд
Теперь ты не ждешь вечно. Вы ждете, когда рабочий косит вашу лужайку, которая просто неэффективна и расточительна . Пока вы ждете, вы можете выполнять другую работу, например, готовить бутерброд. Или вы можете косить газон самостоятельно и не брать на себя оплату найма рабочего.
Вот почему вы никогда, никогда не будете синхронно ждать асинхронной операции. Есть только две возможности: если вы выполняете асинхронную операцию в будущем, вы ждете вечно, что явно не работает. Если нет, то вы теряете время на сон, когда можете выполнять работу, что явно расточительно.
Используйте асинхронность так, как она была разработана: асинхронно .