Как я могу использовать HttpWebRequest (.NET, C #) асинхронно?
c#
.net
asynchronous
httprequest
Джейсон
источник
источник
Ответы:
использование
HttpWebRequest.BeginGetResponse()
Функция обратного вызова вызывается, когда асинхронная операция завершена. Вам нужно хотя бы позвонить
EndGetResponse()
из этой функции.источник
webRequest.Proxy = null
чтобы ускорить запрос резко.Учитывая ответ:
Вы можете отправить указатель запроса или любой другой объект, подобный этому:
Приветствую
источник
До сих пор все были неправы, потому
BeginGetResponse()
что работает с текущим потоком. Из документации :Итак, чтобы сделать это правильно:
Затем вы можете сделать то, что вам нужно с ответом. Например:
источник
Безусловно, самый простой способ - использовать TaskFactory.FromAsync из TPL . Это буквально пара строк кода при использовании в сочетании с новыми ключевыми словами async / await :
Если вы не можете использовать компилятор C # 5, то вышеперечисленное можно выполнить с помощью метода Task.ContinueWith :
источник
В конце концов я использовал BackgroundWorker, он определенно асинхронный в отличие от некоторых из вышеперечисленных решений, он обрабатывает возврат в поток GUI для вас, и его очень легко понять.
Также очень легко обрабатывать исключения, так как они заканчиваются в методе RunWorkerCompleted, но обязательно прочитайте это: Необработанные исключения в BackgroundWorker
Я использовал WebClient, но, очевидно, вы могли бы использовать HttpWebRequest.GetResponse, если хотите.
источник
источник
.NET изменился, так как многие из этих ответов были опубликованы, и я хотел бы предоставить более актуальный ответ. Используйте асинхронный метод для запуска
Task
в фоновом потоке:Чтобы использовать асинхронный метод:
Обновить:
Это решение не работает для приложений UWP, которые используют
WebRequest.GetResponseAsync()
вместо негоWebRequest.GetResponse()
, и не вызываетDispose()
методы там, где это необходимо. У @dragansr есть хорошее альтернативное решение, которое решает эти проблемы.источник
WebRequest.GetResponseAsync()
иStreamReader.ReadToEndAync()
должны быть использованы и ожидаемые.источник