whenall - task httpresponsemessage c#
¿Por qué debe "esperar" estar dentro de un método "asíncrono"? (2)
Para obtener una gran cantidad de información sobre cómo sincronizar y esperar a que funcione internamente, consulte la serie de blogs EduAsync de Jon Skeet: msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx
Este artículo de MSDN también lo explica: http://msdn.microsoft.com/en-us/library/vstudio/hh156513.aspx
Básicamente: un método modificado por la palabra clave async contiene al menos una expresión o declaración de espera. El método se ejecuta sincrónicamente hasta que alcanza la primera expresión de espera, en cuyo punto se suspende hasta que se completa la tarea esperada. Mientras tanto, el control se devuelve a la persona que llama del método. Si el método no contiene una expresión o declaración de espera, entonces se ejecuta de forma síncrona.
Finalmente, este artículo de MSDN: http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx muestra un ejemplo paso a paso, aproximadamente 1/3 del recorrido de la página:
Posible duplicado:
¿Por qué existe la palabra clave async?
Tengo dos métodos. Uno es un método normal ( MyMethod
) y el otro es un método asincrónico ( MyMethodAsync
). Me sale un error de compilación.
static string MyMethod()
{
var result = await MyMethodAsync(); // compile error here
return result;
}
async static Task<string> MyMethodAsync()
{
/** perform my logic here... **/
Thread.Sleep(1000);
return "yes";
}
El mensaje de error es
El operador ''aguardar'' solo puede usarse dentro de un método asíncrono. Considere marcar este método con el modificador ''async'' y cambiar su tipo de devolución a ''Tarea''.
Estoy confundido. Cuando uso la palabra clave await
, el hilo de llamada se suspenderá y esperaré a que se complete la tarea. Entonces, una vez await
está en uso, el método ya no es un método asíncrono. ¿Derecha?
Observación: Sé que debería poner la lógica en MyMethod
y MyMethodAsync
llamar MyMethod
para lograr lo que quiero.
El punto entero de la palabra clave async
es habilitar la palabra clave await
.
Recopilé una cantidad de "¿por qué las palabras clave funcionan de esa manera?" preguntas en mi blog . La pregunta de "¿por qué no se puede inferir async
por la presencia de await
?" fue respondido de manera concluyente por Eric Lippert en su blog . En resumen, dos razones: compatibilidad con versiones anteriores y legibilidad del código.