2012-03-26 12 views
5

Nueva API web ASP.NET HttpClient me ha dado algunos resultados extraños. Aquí está mi código:HttpClient GetStringAsync - Nunca vuelve

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

Esto nunca vuelve y la consola aparece y desaparece repentinamente. Cuando cambio el código de la siguiente manera, funciona como se supone que debe:

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

¿Alguna idea de cuál sería el problema?

+1

Eso ni siquiera compila. Un punto de entrada ('Main') no puede ser asincrónico. Fallará con el error CS4009. – vcsjones

+0

@vcsjones En el Async CTP está permitido (pero es una mala idea) – hvd

+1

@hvd Interesante. Aunque es mejor que no lo permitan ahora. – vcsjones

Respuesta

9

async en Main está deshabilitado en el compilador VS11/.NET 4.5, por lo que supongo que está utilizando el Async CTP. Si usar .NET 4.5 es en absoluto una opción, realice el cambio.

Dejando eso de lado, la razón por la que no funciona es porque async, o más generalmente, las tareas, confían en poder indicar alguna forma de ejecutar el resto del código. Funciona con .Result porque el código se ejecuta de forma síncrona, por lo que el problema no se aplica.

No existe soporte integrado para aplicaciones de consola, ya que no utilizan normalmente bucles de mensajes de la manera que por ejemplo Windows Forms hace, pero se puede ver en Microsoft Visual Studio Async CTP\Samples\(C# Testing) Unit Testing\AsyncTestUtilities, especialmente GeneralThreadAffineContext.cs, para obtener un ejemplo básico que funciona en aplicaciones de consola también.