Comment puis-je utiliser HttpWebRequest (.NET, C #) de manière asynchrone?
c#
.net
asynchronous
httprequest
Jason
la source
la source
Réponses:
Utilisation
HttpWebRequest.BeginGetResponse()
La fonction de rappel est appelée lorsque l'opération asynchrone est terminée. Vous devez au moins appeler à
EndGetResponse()
partir de cette fonction.la source
webRequest.Proxy = null
pour accélérer considérablement la demande.Compte tenu de la réponse:
Vous pouvez envoyer le pointeur de requête ou tout autre objet comme celui-ci:
Salutations
la source
Jusqu'à présent, tout le monde s'est trompé, car
BeginGetResponse()
il travaille sur le fil actuel. De la documentation :Alors pour bien faire:
Vous pouvez alors faire ce dont vous avez besoin avec la réponse. Par exemple:
la source
Le moyen de loin le plus simple consiste à utiliser TaskFactory.FromAsync à partir du TPL . Il s'agit littéralement de quelques lignes de code lorsqu'il est utilisé en conjonction avec les nouveaux mots clés async / await :
Si vous ne pouvez pas utiliser le compilateur C # 5, les opérations ci-dessus peuvent être effectuées à l'aide de la méthode Task.ContinueWith :
la source
J'ai fini par utiliser BackgroundWorker, il est définitivement asynchrone contrairement à certaines des solutions ci-dessus, il gère le retour au thread GUI pour vous, et il est très facile à comprendre.
Il est également très facile de gérer les exceptions, car elles se retrouvent dans la méthode RunWorkerCompleted, mais assurez-vous de lire ceci: Exceptions non gérées dans BackgroundWorker
J'ai utilisé WebClient mais vous pouvez évidemment utiliser HttpWebRequest.GetResponse si vous le souhaitez.
la source
la source
.NET a changé depuis que plusieurs de ces réponses ont été publiées, et j'aimerais fournir une réponse plus à jour. Utilisez une méthode async pour démarrer un
Task
qui s'exécutera sur un thread d'arrière-plan:Pour utiliser la méthode asynchrone:
Mettre à jour:
Cette solution ne fonctionne pas pour les applications UWP qui utilisent à la
WebRequest.GetResponseAsync()
place deWebRequest.GetResponse()
, et n'appelle pas lesDispose()
méthodes le cas échéant. @dragansr a une bonne solution alternative qui résout ces problèmes.la source
WebRequest.GetResponseAsync()
etStreamReader.ReadToEndAync()
doivent être utilisés et attendus.la source