2012-03-26 9 views
5

Nuova API Web ASP.NET HttpClient mi ha dato alcuni strani risultati. Ecco il mio codice:HttpClient GetStringAsync - Non torna mai

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

Questo non ritorna mai e la console appare improvvisamente e scompare. Quando cambio il codice come sotto, funziona come si suppone:

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

Qualche idea su quale sarebbe il problema?

+1

Questo non viene nemmeno compilato. Un punto di ingresso ('Main') non può essere asincrono. Fallirà con l'errore CS4009. – vcsjones

+0

@vcsjones Nel CTP asincrono è consentito (ma una cattiva idea) – hvd

+1

@hvd Interessante. Meglio che ora lo rifiutano. – vcsjones

risposta

9

async su Main non è consentito nel compilatore VS11/.NET 4.5, quindi presumo che si stia utilizzando il CTP asincrono. Se si utilizza .NET 4.5 è un'opzione, effettuare il passaggio.

A parte questo, il motivo per cui non funziona è perché async, o più in generale, le attività, si basano sulla possibilità di segnalare in qualche modo che il resto del codice venga eseguito. Funziona con .Result perché il codice viene eseguito in modo sincrono, quindi il problema non si applica.

Non v'è alcun supporto integrato per le applicazioni console, perché non usano normalmente loop di messaggi nel modo in cui per esempio WinForms fa, ma si può guardare Microsoft Visual Studio Async CTP\Samples\(C# Testing) Unit Testing\AsyncTestUtilities, in particolare GeneralThreadAffineContext.cs, per ottenere un esempio di base che funziona anche nelle applicazioni console.