2013-01-06 8 views
12

Alles funktionierte heute, bis es aufgehört hat ... Unten ist der minimale Quellcode (ich verwende VS 2012 Update 1, .Net 4.5). Wenn ich es ausführe, wird die App beim Aufruf von client.PostAsync() beendet und erreicht so nie Console.ReadLine(). Gleich im Debugger, keine Ausnahme, nichts, Exit-Code 0.HttpClient.PostAsync klopft die App mit Exit-Code 0

Ich habe versucht, Neustart Maschine, Neustart VS2012 - nichts funktioniert.

Noch einmal, alles lief heute, nicht sicher, was sich geändert hat (keine Software wurde installiert usw., alle anderen Netzwerk-Apps funktionieren noch).

Irgendwelche Ideen? Ich glaube, ich verliere meine Meinung.

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

Antwort

29

Ihr Problem ist, dass ein Programm normalerweise beendet, wenn seine Main() Verfahren beendet. Und Ihre Main() endet, sobald Sie die await in Run() treffen, denn so funktioniert async Methoden.

Was sollten Sie tun, ist Run() in ein async Task Verfahren zu machen und dann für die Task in Ihrem Main() Methode warten:

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

private static async Task RunAsync() 
{ 
    … 
} 

paar Hinweise:

  1. Sie sollten nie async void Methoden , es sei denn, Sie müssen (was bei asynchronen Ereignishandlern der Fall ist).
  2. Das Mischen von await und Wait() in einer GUI-Anwendung oder in ASP.NET ist gefährlich, da es zu Deadlocks führt. Aber es ist die richtige Lösung, wenn Sie async in einer Konsolenanwendung verwenden möchten.
+5

+1. Als Tipp ist es einfacher, in 'RunAsync' statt' Main' '' try'/'catch' zu wählen, da' Task.Wait' Exceptions in eine 'AggregateException' umschließt. –

Verwandte Themen