Подтвердить что ты не робот

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();
        }
    }
}
4b9b3361

Ответ 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 в консольном приложении.