2012-10-03 27 views
20

Estoy tratando de utilizar Async y Await al hacer una solicitud web y estoy descubriendo que nunca pasa de la línea de espera. Lo hago desde una aplicación de Metro, pero también verifiqué el problema en una aplicación de winforms.Async y Await con HttpWebRequest.GetResponseAsync

public async Task<string> DoSomething() 
{ 
    string url = "http://imgur.com/gallery/VcBfl.json"; 
    HttpWebRequest request = HttpWebRequest.CreateHttp(url); 

    var ws = await request.GetResponseAsync(); 

    return ws.ResponseUri.ToString(); ; 
} 

Si yo no uso la espera y en su lugar realizo una espera síncrona, funciona, pero necesito esto para ejecutar de forma asincrónica.

¿Qué me falta en este código que está causando la espera de nunca volver?

Respuesta

30

Sospecho que, si sube la pila de llamadas, o llama al Wait o al Result en el Task devuelto. This will cause a deadlock, as I describe on my blog.

siga estos procedimientos recomendados para evitar el estancamiento:

  1. No bloquee el código de async; use async hasta el final.
  2. En sus métodos de "biblioteca", use ConfigureAwait(false).
+2

Gracias. Eso fue exactamente eso. Gracias por el enlace, es muy útil. –

+0

@Stephen, ¡gracias por las publicaciones en el blog! Pregunta aclaratoria: si uso '.ConfigureAwait (false)' en mi lib (básicamente un WebClient), ¿puedo usar '.Result' cuando lo llamo? Parece que funciona, pero no sé qué sucederá cuando lo deje en libertad. – Brad

+0

@Brad: Sí, siempre que el método asíncrono que está llamando haga lo mismo. Sin embargo, no es una buena práctica usar 'Result'; siempre hay mejores opciones. –

Cuestiones relacionadas