Async und Await mit HttpWebRequest.GetResponseAsync
Ich versuche, mit Async und Erwarten, wenn Sie eine web-Anfrage und finde, dass es nie vorbei an der Linie erwarten. Ich Tue dies aus einer Metro-app, aber ich habe auch überprüft, dass das problem in einer winforms app.
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(); ;
}
Wenn ich nicht verwenden, warten und stattdessen ausführen einer synchronen warten, es funktioniert, aber ich brauche diese laufen asynchron.
Was bin ich in diesem code, dass was die erwarten, kehren nie zurück?
InformationsquelleAutor John Koerner | 2012-10-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vermute ich, dass weiter oben auf Ihren Anruf-Stapel, bist du entweder anrufen
Wait
oderResult
auf der zurückgegebenenTask
. Dies führt zu einem deadlock, da beschreibe ich auf meinem blog.Befolgen Sie diese best practices zu vermeiden, die deadlock:
async
code; verwendenasync
alle dem Weg nach unten.ConfigureAwait(false)
.vielen Dank für die blog-Beiträge! Klärung der Frage: wenn ich
.ConfigureAwait(false)
in meiner lib (im Grunde ein WebClient), kann ich dann verwenden.Result
beim Aufruf? Es scheint zu funktionieren, aber ich weiß nicht, was passieren wird, wenn ich es lose in der wildnis.Ja, solange die async-Methode, die Sie aufrufen nicht die gleiche Sache. Es ist jedoch nicht die optimale Methode in der Verwendung
Result
; es gibt immer bessere Möglichkeiten.die async-Methode, ich rufe zurück, eine Aufgabe und NICHT das Ergebnis. Der code handelt es sich um einen benutzerdefinierten wrapper für den Aufruf einer internen API und der einzige Teil, den ich machen will "async" in der aktuellen GET/POST Methoden (GetRequestStreamAsync, GetResponseAsync, etc). Wie halte ich diese async, ohne jede Methode, die zwischen dieser und der controller-Aktion "async" und die Rückgabe einer Aufgabe? Ich möchte für die lib, die kümmern sich um die asynchrone Natur und der Verbraucher zu bleiben, Agnostiker.
Das ist nicht möglich, aufgrund der Art der asynchronen code. Es ist am besten zu verwenden ist async.
InformationsquelleAutor Stephen Cleary