2013-01-06 8 views
12

Tutto funzionava fino a quando non si arrestava ... Di seguito è riportato il codice sorgente minimo (sto usando VS 2012 Update 1, .Net 4.5). Quando lo eseguo, l'app si chiude quando si chiama client.PostAsync() e quindi non raggiunge mai Console.ReadLine(). Lo stesso nel debugger, nessuna eccezione, niente, codice di uscita 0.HttpClient.PostAsync mette fuori gioco l'app con il codice di uscita 0

Ho provato a riavviare la macchina, riavviare VS2012 - non funziona nulla.

Ancora una volta, tutto era in esecuzione oggi, non so cosa sia cambiato (nessun software è stato installato ecc, tutte le altre app di rete funzionano ancora).

Qualche idea? Penso che sto perdendo la testa.

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

risposta

29

Il tuo problema è che un programma normalmente esce quando il suo metodo di Main() finisce. E il tuo Main() termina non appena hai colpito il await in Run(), perché è così che funzionano i metodi async.

cosa si dovrebbe fare è quello di rendere Run() in un metodo async Task e quindi attendere che il Task nel Main() metodo:

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

private static async Task RunAsync() 
{ 
    … 
} 

Pochi più note:

  1. si dovrebbe mai usare async void metodi , a meno che non sia necessario (che è il caso dei gestori di eventi asincroni).
  2. Miscelare await e Wait() in un'applicazione GUI o in ASP.NET è pericoloso perché causa deadlock. Ma è la soluzione giusta se si desidera utilizzare async in un'applicazione console.
+5

+1. Come suggerimento, è più facile fare il 'top' di livello più alto' 'catch' in' RunAsync' piuttosto che 'Main', perché' Task.Wait' comprimerà le eccezioni in un 'AggregateException'. –