HttpClient.PostAsync выбивает приложение с кодом выхода 0
Все работало сегодня, пока оно не остановилось... Ниже приведен минимальный исходный код (я использую VS 2012 Update 1,.Net 4.5). Когда я запускаю его, приложение выходит при вызове client.PostAsync() и поэтому никогда не достигает Console.ReadLine(). То же самое в отладчике, без исключения, ничего, код выхода 0.
Я попытался перезагрузить машину, перезапустив VS2012 - ничего не работает.
Снова все работает сегодня, не уверен, что изменилось (программное обеспечение не установлено и т.д., все остальные сетевые приложения все еще работают).
Любые идеи? Я думаю, что теряю сознание.
class Program
{
static void Main(string[] args)
{
Run();
}
private async static void Run()
{
using (var client = new System.Net.Http.HttpClient())
{
var headers = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("submit.x", "48"),
new KeyValuePair<string, string>("submit.y", "15"),
new KeyValuePair<string, string>("submit", "login")
};
var content = new FormUrlEncodedContent(headers);
HttpResponseMessage response = await client.PostAsync("http://www.google.com/", content);
Console.ReadLine();
}
}
}
Ответы
Ответ 1
Ваша проблема заключается в том, что программа обычно завершается, когда заканчивается ее метод Main()
. И ваш Main()
заканчивается, как только вы нажимаете await
в Run()
, потому что это работает как методы async
.
Что вы должны сделать, это сделать Run()
в методе async Task
, а затем дождаться Task
в вашем методе Main()
:
static void Main()
{
RunAsync().Wait();
}
private static async Task RunAsync()
{
…
}
Несколько заметок:
- Вы никогда не должны использовать методы
async void
, если вам не нужно (это относится к обработчикам событий async).
- Смешивание
await
и Wait()
в графическом приложении или в ASP.NET опасно, потому что это приводит к взаимоблокировкам. Но это правильное решение, если вы хотите использовать async
в консольном приложении.