¿Por qué existe la palabra clave async?

Al navegar por el canal 9 videos msdn, encontré el siguiente comentario sin respuesta y esperaba que alguien pudiera explicarlo.

No entiendo el objective de la palabra clave asincrónica. ¿Por qué no simplemente permitir la palabra clave await en cualquier momento en que el método devuelva la tarea, al igual que los iteradores pueden generar retorno en cualquier método que devuelva IEnumerable?

Estoy seguro de que hay una buena razón, solo me gustaría entender por qué la sugerencia anterior no fue posible.

Se introdujo principalmente para evitar problemas de compatibilidad con versiones anteriores. Si el comstackdor debe inferir la async -ness de un método (que sería a través de la detección de palabras clave en await ), existen situaciones sutiles en las que el código existente sería tratado de manera diferente, especialmente cuando tiene identificadores (nombres de variables o funciones) llamado await ).

Una explicación completa está aquí: http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx

Creo que quizás este artículo cubre el razonamiento:

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

El primer párrafo dice:

Varias personas me han preguntado qué es lo que motiva la decisión de diseño para requerir que cualquier método que contenga una expresión “en espera” vaya precedido de la palabra clave contextual “asincrónico”.

Concluye:

Eso es un montón de pros y contras; después de evaluarlos a todos, y de jugar con el comstackdor prototipo para ver cómo se sentía, los diseñadores de C # decidieron requerir “asincronización” en un método que contiene una “espera”. Creo que es una elección razonable.

El cortocircuito es compatibilidad hacia atrás.

Otras lecturas:

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

Para mí, la razón más convincente es que el significado de la statement de return cambia cuando una función se vuelve async . Sin return x asnyc return x significa “devolver una tarea con el valor x “, y con asincrónico significa “establecer el resultado de la tarea en x .

Escribí un resumen de las preguntas clave async / await en mi blog hace un tiempo.

Aquí está la conclusión de la sección “Inferring async “:

Eric Lippert tiene la publicación definitiva sobre el tema. También se ha discutido en comentarios de blog , Channel9 y foros .

Para resumir, una palabra clave await palabra sería un gran cambio. La elección fue entre una espera múltiple (por ejemplo, await for ) o una palabra clave en el método ( async ) que permitiría la palabra clave await solo dentro de ese método. Los métodos de marca explícitamente async son más fáciles de analizar para humanos y computadoras, por lo que decidieron ir con el par async/await .