2012-02-10 17 views
36

Navegando por el canal 9 videos msdn Encontré el siguiente comentario sin respuesta y esperaba que alguien pudiera explicarlo?¿Por qué existe la palabra clave async

No entiendo el objetivo de la palabra clave asincrónica. ¿Por qué no simplemente permitir que espere palabra clave cada vez que el método devuelve Tarea, al igual que los iteradores pueden producir 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.

+8

Mi spidey-sense es hormigueo ... Jon Skeet está en camino! Mientras todos esperamos, un poco más de lectura: http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence- await.aspx –

+1

Necesitar dos palabras clave en ubicaciones separadas para implementar una nueva característica parece una mala opción de diseño. El hecho de que bastantes personas hacen esta pregunta significa (para mí) que se tomó la decisión equivocada. Al leer todo el razonamiento en los blogs, puedo seguir la lógica, pero el compromiso no siempre es el mejor plan. A veces es mejor romper un código y seguir adelante. – adelphus

+1

Personalmente creo que se tomó la decisión más segura. Si todo lo que se encuentra entre romper el código y no romper el código es una palabra clave simple, entonces esa no es una tarea demasiado onerosa. Las personas pueden hablar al respecto, pero se puede suponer que no experimentarán el problema de compatibilidad con versiones anteriores. Muchas personas que aceptan o son imparciales no son vocales. –

Respuesta

19

Fue introducido principalmente para evitar problemas de compatibilidad con versiones anteriores. Si el async -nuencia de un método debe ser inferido por el compilador (que sería mediante la detección de await palabras clave), existen situaciones sutiles en las que el código existente se trataría 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

15

Creo que tal vez este artículo cubre el razonamiento:

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

El primer párrafo:

Varias personas me han preguntado lo que motiva la decisión de diseño a requiere ningún método que contiene una expresión "en espera" con el prefijo con la palabra clave contextual "async".

Concluye:

Eso es un montón de pros y contras; después de evaluarlos a todos, y jugando con el compilador de prototipos para ver cómo se sentía, los diseñadores de C# decidieron requerir "async" en un método que contiene un "esperar". Creo que es una elección razonable.

El defecto es la compatibilidad con versiones anteriores.

Más información:

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

+4

+1. Citar a Eric Lippert es la siguiente mejor cosa para * ser * Eric Lippert :) – Benjol

+8

Simplemente agregaría que deseo sinceramente que los diseñadores de C# 2 hayan decidido poner "iterador" o alguna palabra clave similar al comienzo de cada método que se pretende ser un iterador Es muy molesto tener que analizar * potencialmente todo el cuerpo del método * antes de saber si es un bloque iterador o no. –

+1

Sin mencionar que permitiría que los métodos anónimos también sean iteradores. –

8

Para mí, la razón más convincente es que el significado de la declaración return cambia cuando se convierte en una función async. Sin asnycreturn x significa "devolver una tarea con el valor x", y con asíncrono que significa "establecer el resultado de la tarea a x.

2

escribí un summary of async/await keyword questions en mi blog hace un tiempo.

está aquí la conclusión de la sección "inferir async":

Eric Lippert tiene la definitive post sobre el tema.También se ha discutido en blog comments, Channel9 y forums.

En resumen, una palabra clave await de una palabra sería un cambio demasiado grande. La elección fue entre una espera múltiple (por ejemplo, await for) o una palabra clave en el método (async) que habilitaría la palabra clave await solo dentro de ese método. Los métodos de marcado explícito async son más fáciles de analizar tanto para humanos como para computadoras, por lo que decidieron usar el par async/await.

Cuestiones relacionadas