Wie kann ich HttpWebRequest (.NET, C #) asynchron verwenden?
c#
.net
asynchronous
httprequest
Jason
quelle
quelle
Antworten:
Verwenden
HttpWebRequest.BeginGetResponse()
Die Rückruffunktion wird aufgerufen, wenn der asynchrone Vorgang abgeschlossen ist. Sie müssen mindestens
EndGetResponse()
von dieser Funktion aus aufrufen .quelle
webRequest.Proxy = null
, um die Anforderung drastisch zu beschleunigen.Betrachtet man die Antwort:
Sie können den Anforderungszeiger oder ein anderes Objekt wie folgt senden:
Schöne Grüße
quelle
Bisher haben sich alle geirrt, weil
BeginGetResponse()
einige am aktuellen Thread arbeiten. Aus der Dokumentation :Um dies richtig zu machen:
Mit der Antwort können Sie dann tun, was Sie brauchen. Beispielsweise:
quelle
Der mit Abstand einfachste Weg ist die Verwendung von TaskFactory.FromAsync aus der TPL . In Verbindung mit den neuen Schlüsselwörtern async / await sind es buchstäblich ein paar Codezeilen :
Wenn Sie den C # 5-Compiler nicht verwenden können, können Sie die oben genannten Schritte mit der Task.ContinueWith- Methode ausführen :
quelle
Am Ende habe ich BackgroundWorker verwendet. Im Gegensatz zu einigen der oben genannten Lösungen ist es definitiv asynchron. Es übernimmt die Rückkehr zum GUI-Thread für Sie und ist sehr einfach zu verstehen.
Es ist auch sehr einfach, Ausnahmen zu behandeln, da sie in der RunWorkerCompleted-Methode enden. Lesen Sie jedoch Folgendes : Nicht behandelte Ausnahmen in BackgroundWorker
Ich habe WebClient verwendet, aber natürlich können Sie HttpWebRequest.GetResponse verwenden, wenn Sie möchten.
quelle
quelle
.NET hat sich geändert, seit viele dieser Antworten veröffentlicht wurden, und ich möchte eine aktuellere Antwort geben. Verwenden Sie eine asynchrone Methode, um eine Methode zu starten
Task
, die in einem Hintergrundthread ausgeführt wird:So verwenden Sie die asynchrone Methode:
Aktualisieren:
Diese Lösung funktioniert nicht für UWP-Apps, die
WebRequest.GetResponseAsync()
anstelle von verwendenWebRequest.GetResponse()
, und ruft dieDispose()
Methoden gegebenenfalls nicht auf. @dragansr hat eine gute alternative Lösung, die diese Probleme behebt.quelle
WebRequest.GetResponseAsync()
undStreamReader.ReadToEndAync()
müssen verwendet werden und abgewartet.quelle