Отправлять данные по http асинхронно

Я новичок в С#, и я хотел бы отправлять веб-запрос асинхронно. Я использую HttpWebRequest с методом POST. Проблема в том, что если я использую функцию GetRequestStream(), мое приложение зависает, даже если я получаю ответ асинхронно. Читаю, функция GetRequestStream() сразу пытается связаться с сервером. Я нашел функцию BeginGetResponse(), но не понимаю, как ею пользоваться.

Может ли кто-нибудь объяснить мне, как это работает? Как писать данные поста асинхронно?

Я хотел бы написать такую ​​функцию (независимо от того, сколько других частных функций мне нужно написать):

public delegate void ReceiveFunc(HttpWebResponse response);

public static void sendRequest(string url, HttpWebRequest request, string content, ReceiveFunc callback) {
    // Return response back to callback
}

Спасибо.


person eSeverus    schedule 17.02.2015    source источник
comment
Посмотрите на класс HttpClient и ключевые слова async-await. Вам станет легче.   -  person Yuval Itzchakov    schedule 17.02.2015
comment
GetRequestStream() не является асинхронной операцией.   -  person JNYRanger    schedule 17.02.2015
comment
@YuvalItzchakov прав: HttpClient проще в использовании. Но если вы новичок в C#, я настоятельно рекомендую сначала прочитать async/await.   -  person Krumelur    schedule 17.02.2015
comment
Спасибо, ребята, я посмотрю на этот класс, он кажется хорошим. Если вы напишете это как ответ, я отмечу это как ответ на этот вопрос.   -  person eSeverus    schedule 17.02.2015
comment
Ну, класса HttpClient не существует. Что здесь происходит?   -  person eSeverus    schedule 17.02.2015


Ответы (1)


Предполагая, что вы используете C# 5.0, вы должны использовать новые ключевые слова async-await с асинхронными функциями.

Вместо GetRequestStream() можно использовать Stream s = await request.GetRequestStreamAsync()

Если вы хотите асинхронно получить ответ, вы должны вызвать:

HttpWebResponse response = await request.GetResponseAsync()

Это сделает вашу жизнь намного проще, чем использование старого метода обратных вызовов с функциями Begin и End.

Просто имейте в виду, что везде, где вы используете ключевое слово await, функция должна быть помечена async.

Вот статья MSDN об использовании ключевых слов async-await: https://msdn.microsoft.com/en-us/library/hh191443.aspx

person JNYRanger    schedule 17.02.2015