С# 5 асинхронная/ждущая механика потоков ошибочна?

Почему вызывающий поток переходит в метод async, пока внутренний "ждут"?

Не просто ли очистить поток, как только вызывается метод асинхронного вызова. Таким образом, вы точно знаете, что метод async немедленно возвращается. Вам не нужно беспокоиться о том, чтобы не делать ничего дорогого на ранних этапах асинхронного метода.

Мне нравится знать, будет ли метод выполнять код в потоке "мой" или нет. Блокирует он или нет. Эта модель, по-видимому, открывает целый спектр промежуточных возможностей.

Дизайнеры гораздо умнее, чем я, поэтому я уверен, что есть веская причина, я просто хотел бы окунуться в нее.

Ответ 1

Не просто ли очистить поток, как только вызывается метод асинхронного вызова.

Весь смысл "асинхронных" методов заключается в том, чтобы избежать появления нового потока.

Вы запутываете асинхронность с concurrency. Асинхронные методы не должны выполняться в другом потоке, чтобы быть асинхронными. Точка асинхронных методов заключается в том, что они позволяют разбить работу на маленькие кусочки, которые должны выполняться в определенном порядке, но необязательно, без выполнения другой работы над одним и тем же потоком.

Подумайте о потоке, как о работнике, которого вы можете нанять. Подумайте об асинхронном методе как список дел с паузами между элементами. Если ваш список дел говорит: "Идите в магазин, покупайте молоко и яйца, отправляйтесь домой, делайте омлет", тогда преимущество асинхронного действия заключается в том, что когда кто-то называет ваш сотовый телефон между шагом "покупать яйца" и "идет домой" и говорит: "Можете ли вы зайти в аптеку по дороге домой и забрать мой рецепт?" вы можете принять вызов и запланировать работу, прежде чем делать омлет. При использовании неасинхронных методов телефон продолжает звонить до тех пор, пока омлет не будет выполнен, а затем вы вызовете вызов. Пользовательский интерфейс блокируется, пока вы не закончите то, что делаете.

Ваша концепция заключается в том, что для того, чтобы поддерживать поток пользовательского интерфейса, в тот момент, когда вы получаете список дел, вы отправляете нанимать какого-нибудь парня, чтобы бежать в магазин для вас, чтобы вы могли принять вызов о аптека. Это дорого и не нужно. Все может оставаться в одном потоке с помощью async, потому что у длительной задачи есть встроенные точки, где пользовательский интерфейс прервет и заплатит больше работы.

Ответ 2

Мне нравится думать, что async..await является синтаксическим сахаром для программирования стиля продолжения прохождения.

Имея это в виду, он не имеет ничего общего с потоками.

Ответ 3

Мне нравится знать, будет ли метод выполнять код в потоке "мой" или нет.

Я думаю, что это своеобразное желание, не очень хороший аргумент для/против какой-либо функции.

Основная проблема async/await заключается в том, что код для запуска async op и обработки результатов может быть сохранен в один метод.

Без этого вы вынуждены сломать код, который логически принадлежит вместе на 2 части.