C # 5 асинхронная / ожидающая механика потока чувствует себя неправильно? - PullRequest
11 голосов
/ 13 января 2012

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

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

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

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

Ответы [ 3 ]

38 голосов
/ 13 января 2012

Разве не чище просто порождать поток, как только вызывается асинхронный метод.

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

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

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

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

3 голосов
/ 13 января 2012

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

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

2 голосов
/ 13 января 2012

Мне хотелось бы знать, собирается ли метод выполнять код в «моем» потоке или нет.

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

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

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

...