Все до сих пор были неправы, потому что BeginGetResponse()
выполняет некоторую работу с текущим потоком. Из документации :
Метод BeginGetResponse требует некоторых задач синхронной установки для
завершено (разрешение DNS, обнаружение прокси и подключение через сокет TCP,
например) до того, как этот метод станет асинхронным. В следствии,
этот метод никогда не должен вызываться в потоке пользовательского интерфейса (UI)
потому что это может занять значительное время (до нескольких минут
в зависимости от настроек сети) для завершения начального синхронного
Задачи установки до того, как будет сгенерировано исключение для ошибки или метод
преуспевает.
Итак, чтобы сделать это правильно:
void DoWithResponse(HttpWebRequest request, Action<HttpWebResponse> responseAction)
{
Action wrapperAction = () =>
{
request.BeginGetResponse(new AsyncCallback((iar) =>
{
var response = (HttpWebResponse)((HttpWebRequest)iar.AsyncState).EndGetResponse(iar);
responseAction(response);
}), request);
};
wrapperAction.BeginInvoke(new AsyncCallback((iar) =>
{
var action = (Action)iar.AsyncState;
action.EndInvoke(iar);
}), wrapperAction);
}
Затем вы можете сделать то, что вам нужно, с ответом. Например:
HttpWebRequest request;
// init your request...then:
DoWithResponse(request, (response) => {
var body = new StreamReader(response.GetResponseStream()).ReadToEnd();
Console.Write(body);
});