¿Podría alguien tener la amabilidad de confirmar si he entendido correctamente la palabra clave Async? (Utilizando la versión 3 del CTP)¿Async espera la palabra clave equivalente a un ContinueWith lambda?
Hasta ahora he descubierto que insertar la palabra clave await antes de una llamada a un método esencialmente hace 2 cosas, A. Crea un retorno inmediato y B. Crea una "continuación" que se invoca al completar la invocación del método async. En cualquier caso, la continuación es el resto del bloque de código para el método.
Entonces, lo que me pregunto es si estos dos bits de código son técnicamente equivalentes, y si es así, básicamente significa que la palabra clave await es idéntica a la de un ContinueWith Lambda (es decir, es básicamente un atajo de compilación) ? Si no es así, ¿cuáles son las diferencias?
bool Success =
await new POP3Connector(
"mail.server.com", txtUsername.Text, txtPassword.Text).Connect();
// At this point the method will return and following code will
// only be invoked when the operation is complete(?)
MessageBox.Show(Success ? "Logged In" : "Wrong password");
VS
(new POP3Connector(
"mail.server.com", txtUsername.Text, txtPassword.Text).Connect())
.ContinueWith((success) =>
MessageBox.Show(success.Result ? "Logged In" : "Wrong password"));
muy bien dicho - Intento deferirme a las publicaciones de Jon, ya que son mucho más extensas que cualquier cosa que tuviera tiempo de poner en una respuesta en SO, pero Stephen tiene toda la razón. WRT lo que está a la espera (y GetAwaiter en particular), su publicación # 3 es muy útil en mi humilde opinión :) http://msmvps.com/blogs/jon_skeet/archive/2011/05/13/eduasync-part-3-the-shape- of-the-async-method-awaitable-boundary.aspx –
El lugar de Stephen aquí. Para ejemplos simples, es fácil pensar que async/await es solo un atajo para ContinueWith; sin embargo, me gusta pensarlo en el reverso. Async/await es en realidad una expresión más poderosa de lo que solía usar ContinueWith para. El problema es que ContinueWith (...) usa lambdas y permite que la ejecución se transfiera a la continuación, pero otros conceptos de flujo de control como bucles son bastante imposibles si tiene que poner la mitad del cuerpo del bucle antes que el ContinueWith (... .) y la otra mitad después. Terminas con el encadenamiento de continuación manual. –
Otro ejemplo donde async/await es mucho más expresivo que ContinueWith (...) está fluyendo excepciones. Puede esperar varias veces dentro del mismo bloque de prueba, y para cada etapa de ejecución, sus excepciones se pueden canalizar al mismo bloque catch (...) sin tener que escribir toneladas de código que lo hagan explícitamente. –