web-dev-qa-db-fra.com

Async et attente avec HttpWebRequest.GetResponseAsync

J'essaie d'utiliser Async et Await lors d'une demande Web et je constate qu'elle ne dépasse jamais la ligne d'attente. Je fais cela à partir d'une application Metro, mais j'ai également vérifié le problème dans une application Winforms.

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 je n'utilise pas wait et effectue une attente synchrone à la place, cela fonctionne, mais j'en ai besoin pour fonctionner de manière asynchrone.

Qu'est-ce qui me manque dans ce code qui fait que l'attente ne revient jamais?

21
John Koerner

Je soupçonne que plus haut dans votre pile d'appels, vous appelez soit Wait ou Result sur le Task retourné. Cela entraînera un blocage, comme je le décris sur mon blog .

Suivez ces meilleures pratiques pour éviter l'impasse:

  1. Ne bloquez pas sur le code async; utilisez async jusqu'en bas.
  2. Dans vos méthodes de "bibliothèque", utilisez ConfigureAwait(false).
34
Stephen Cleary