Como posso usar o HttpWebRequest (.NET, C #) de forma assíncrona?
c#
.net
asynchronous
httprequest
Jason
fonte
fonte
Respostas:
Usar
HttpWebRequest.BeginGetResponse()
A função de retorno de chamada é chamada quando a operação assíncrona estiver concluída. Você precisa pelo menos ligar a
EndGetResponse()
partir desta função.fonte
webRequest.Proxy = null
para acelerar drasticamente a solicitação.Considerando a resposta:
Você pode enviar o ponteiro da solicitação ou qualquer outro objeto como este:
saudações
fonte
Todo mundo até agora está errado, porque
BeginGetResponse()
faz algum trabalho no segmento atual. A partir da documentação :Então, para fazer isso direito:
Você pode fazer o que precisar com a resposta. Por exemplo:
fonte
De longe, a maneira mais fácil é usar o TaskFactory.FromAsync da TPL . É literalmente algumas linhas de código quando usadas em conjunto com as novas palavras-chave async / wait :
Se você não pode usar o compilador C # 5, o procedimento acima pode ser realizado usando o método Task.ContinueWith :
fonte
Acabei usando o BackgroundWorker, é definitivamente assíncrono, ao contrário de algumas das soluções acima, ele lida com o retorno ao thread da GUI para você e é muito fácil de entender.
Também é muito fácil lidar com exceções, pois elas acabam no método RunWorkerCompleted, mas certifique-se de ler o seguinte: Exceções não tratadas no BackgroundWorker
Eu usei o WebClient, mas obviamente você poderia usar HttpWebRequest.GetResponse, se quisesse.
fonte
fonte
O .NET mudou desde que muitas dessas respostas foram postadas e eu gostaria de fornecer uma resposta mais atualizada. Use um método assíncrono para iniciar um
Task
que será executado em um encadeamento em segundo plano:Para usar o método assíncrono:
Atualizar:
Esta solução não funciona para aplicativos UWP que usam em
WebRequest.GetResponseAsync()
vez deWebRequest.GetResponse()
e não chama osDispose()
métodos quando apropriado. O @dragansr tem uma boa solução alternativa que resolve esses problemas.fonte
WebRequest.GetResponseAsync()
eStreamReader.ReadToEndAync()
precisa ser usado e aguardado.fonte