2012-10-03 6 views
20

Ich versuche Async und Warte beim Erstellen einer Web-Anfrage zu verwenden und stelle fest, dass es niemals über die Wartezeit hinauskommt. Ich mache das von einer Metro-App, aber ich habe das Problem auch in einer winforms-App überprüft.Async und erwarte mit HttpWebRequest.GetResponseAsync

Wenn ich nicht warten erwarte und stattdessen eine synchrone warten, funktioniert es, aber ich brauche das asynchron zu laufen.

Was fehlt mir in diesem Code, der dazu führt, dass die Wartezeit nie wieder kommt?

Antwort

30

Ich vermute, dass weiter oben auf Ihrem Call-Stack, entweder Sie rufen Wait oder Result auf die zurückgegebenen Task. This will cause a deadlock, as I describe on my blog.

Befolgen Sie diese Best Practices aus der Sackgasse zu vermeiden:

  1. nicht auf async Code Blockieren Sie; Verwenden Sie async den ganzen Weg hinunter.
  2. Verwenden Sie in Ihren "Bibliothek" -Methoden ConfigureAwait(false).
+2

Vielen Dank. Das war es genau. Danke für den Link, es ist sehr hilfreich. –

+0

@Stephen, danke für die Blogposts! Klärende Frage: Wenn ich '.ConfigureAwait (false)' in meiner lib (im Grunde ein WebClient) verwende, kann ich dann '.Result' verwenden, wenn ich sie anrufe? Es scheint zu funktionieren, aber ich weiß nicht, was passieren wird, wenn ich es in der Wildnis loslasse. – Brad

+0

@Brad: Ja, solange die asynchrone Methode, die Sie anrufen, dasselbe tut. Es ist jedoch keine bewährte Methode, "Ergebnis" zu verwenden. es gibt immer bessere Möglichkeiten. –