Почему существует асинхронное ключевое слово? - PullRequest
39 голосов
/ 10 февраля 2012

Просматривая канал 9 msdn видео Я нашел следующий оставшийся без ответа комментарий и надеялся, что кто-нибудь сможет это объяснить?

Я не понимаю смысл ключевого слова async. Почему бы просто не позволить ключевое слово await каждый раз, когда метод возвращает Task, как итераторы может выдавать return для любого метода, который возвращает IEnumerable.

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

Ответы [ 4 ]

21 голосов
/ 10 февраля 2012

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

Полное объяснение здесь: http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx

15 голосов
/ 10 февраля 2012

Я думаю, что, возможно, эта статья охватывает рассуждения:

http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx

Первый абзац гласит:

Несколько человек спросили меня, что мотивирует дизайнерское решение требует, чтобы любой метод, который содержит выражение "await", имел префикс с контекстным ключевым словом "async".

Заключает:

Это много плюсов и минусов; после оценки всех их, и много поиграть с прототипом компилятора, чтобы увидеть, как он себя чувствует, дизайнеры C # решили использовать асинхронный метод, который содержит «жду». Я думаю, что это разумный выбор.

Суть в обратной совместимости.

Дальнейшее чтение:

http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence-await.aspx

9 голосов
/ 10 февраля 2012

Для меня самая веская причина в том, что значение оператора return меняется, когда функция становится async. Без asnyc return x означает «вернуть задачу со значением x», а с асинхронным - «установить результат задачи на x.

2 голосов
/ 10 февраля 2012

Некоторое время назад я написал сводку вопросов по ключевым словам async / await в своем блоге.

Вот вывод из раздела "Inferring async":

Эрик Липперт имеет окончательный пост на эту тему.Это также обсуждалось в комментариях к блогам , Channel9 и форумах .

Подводя итог, можно сказать, что ключевое слово await, состоящее из одного слова, будетслишком большой переломный момент.Выбор был между несколькими словами await (например, await for) или ключевым словом метода (async), который включил бы ключевое слово await только внутри этого метода.Методы async явно помечены как для людей, так и для компьютеров, поэтому они решили использовать пару async/await.

...