2012-03-26 49 views
5

Nowe API ASP.NET Web HttpClient daje mi dziwne wyniki. Oto mój kod:HttpClient GetStringAsync - To nigdy nie wróci

class Program { 

    static async void Main(string[] args) { 

     var address = "http://localhost:3895/api/urls"; 

     Console.WriteLine(await getStringAsync(address)); 
     Console.ReadLine(); 

    } 

    public static async Task<string> getStringAsync(string uri) { 

     var httpClient = new HttpClient(); 
     return await httpClient.GetStringAsync(uri); 
    } 
} 

To nigdy nie wraca, a konsola nagle pojawia się i znika. Kiedy zmieniam kod, jak poniżej, działa on tak, jak powinien:

static void Main(string[] args) { 

    var address = "http://localhost:3895/api/urls"; 

    Console.WriteLine(getString(address)); 
    Console.ReadLine(); 

} 

public static string getString(string uri) { 

    var httpClient = new HttpClient(); 

    return httpClient.GetStringAsync(uri).Result; 
} 

Jaki jest pomysł?

+1

To nawet nie kompiluje. Punkt wejścia ('Main') nie może być asynchroniczny. Nie uda się z błędem CS4009. – vcsjones

+0

@vcsjones W CBS Async jest dozwolone (ale zły pomysł) – hvd

+1

@hvd Ciekawe. Najlepsze, że teraz nie chcą tego. – vcsjones

Odpowiedz

9

async na Main jest niedozwolone w kompilatorze VS11/.NET 4.5, więc zakładam, że korzystasz z Async CTP. Jeśli używasz .NET 4.5 jest w ogóle opcją, zrób przełącznik.

Poza tym powodem, dla którego to nie działa, jest to, że async, a bardziej ogólnie, zadania polegają na tym, że mogą sygnalizować w jakiś sposób pozostałą część kodu do wykonania. Działa z .Result, ponieważ kod działa synchronicznie, więc problem nie dotyczy.

Nie ma wbudowanej obsługi aplikacji konsoli, ponieważ zazwyczaj nie używają pętli wiadomości w taki sposób, jak na przykład WinForms, ale można spojrzeć na Microsoft Visual Studio Async CTP\Samples\(C# Testing) Unit Testing\AsyncTestUtilities, szczególnie GeneralThreadAffineContext.cs, aby uzyskać podstawowy przykład, który działa również w aplikacjach konsolowych.

Powiązane problemy