¿Cómo puedo usar HttpWebRequest (.NET, C #) de forma asincrónica?
c#
.net
asynchronous
httprequest
Jason
fuente
fuente
Respuestas:
Utilizar
HttpWebRequest.BeginGetResponse()
Se llama a la función de devolución de llamada cuando se completa la operación asincrónica. Necesita al menos llamar
EndGetResponse()
desde esta función.fuente
webRequest.Proxy = null
para acelerar la solicitud dramáticamente.Considerando la respuesta:
Puede enviar el puntero de solicitud o cualquier otro objeto como este:
Saludos
fuente
Todos hasta ahora se han equivocado, porque
BeginGetResponse()
funciona un poco en el hilo actual. De la documentación :Para hacer esto bien:
Luego puede hacer lo que necesite con la respuesta. Por ejemplo:
fuente
Con mucho, la forma más fácil es usar TaskFactory.FromAsync desde el TPL . Es literalmente un par de líneas de código cuando se usa junto con las nuevas palabras clave async / wait :
Si no puede usar el compilador C # 5, lo anterior se puede lograr usando el método Task.ContinueWith :
fuente
Terminé usando BackgroundWorker, definitivamente es asíncrono a diferencia de algunas de las soluciones anteriores, maneja el retorno al hilo de la GUI por usted y es muy fácil de entender.
También es muy fácil manejar excepciones, ya que terminan en el método RunWorkerCompleted, pero asegúrese de leer esto: Excepciones no controladas en BackgroundWorker
Usé WebClient pero obviamente podrías usar HttpWebRequest.GetResponse si quisieras.
fuente
fuente
.NET ha cambiado desde que se publicaron muchas de estas respuestas, y me gustaría proporcionar una respuesta más actualizada. Use un método asíncrono para iniciar un
Task
que se ejecutará en un hilo de fondo:Para usar el método asíncrono:
Actualizar:
Esta solución no funciona para aplicaciones UWP que usan en
WebRequest.GetResponseAsync()
lugar deWebRequest.GetResponse()
, y no llama a losDispose()
métodos cuando corresponde. @dragansr tiene una buena solución alternativa que aborda estos problemas.fuente
WebRequest.GetResponseAsync()
yStreamReader.ReadToEndAync()
necesita ser usado y esperado.fuente