2013-01-06 16 views
12

Wszystko działało do chwili zatrzymania ... Poniżej znajduje się minimalny kod źródłowy (używam VS 2012 Update 1, .Net 4.5). Po uruchomieniu aplikacja opuszcza połączenie z klientem.PostAsync() i nigdy nie dociera do Console.ReadLine(). To samo w debugerze, bez wyjątku, nic, kod zakończenia 0.HttpClient.PostAsync usuwa aplikację z kodem wyjścia 0

Próbowałem uruchomić ponownie komputer, restartując VS2012 - nic nie działa.

Znowu wszystko działało dzisiaj, nie wiem, co się zmieniło (nie zainstalowano żadnego oprogramowania itp., Wszystkie pozostałe aplikacje sieciowe nadal działają).

Wszelkie pomysły? Myślę, że tracę rozum.

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

Odpowiedz

29

Twoim problemem jest to, że program zwykle wychodzi po zakończeniu jego metoda Main(). Twój Main() kończy się zaraz po naciśnięciu await w Run(), ponieważ tak działają metody .

Co należy zrobić, aby Run() w metodzie async Task a następnie czekać na Task w swojej metodzie Main():

static void Main() 
{ 
    RunAsync().Wait(); 
} 

private static async Task RunAsync() 
{ 
    … 
} 

Niewiele więcej Uwagi:

  1. Nigdy nie należy używać async void metod , chyba że musisz (co jest związane z obsługą zdarzeń asynchronicznych).
  2. Mieszanie await i Wait() w aplikacji GUI lub w ASP.NET jest niebezpieczne, ponieważ prowadzi do zakleszczenia. Ale jest to właściwe rozwiązanie, jeśli chcesz użyć async w aplikacji konsolowej.
+5

+1. Jako wskazówka, łatwiej jest wykonać 'try' /' catch "najwyższego poziomu w' RunAsync' zamiast 'Main', ponieważ' Task.Wait' opakuje wyjątki w 'AggregateException'. –

Powiązane problemy