HttpClient GetStringAsync - 它永远不会回来

时间:2012-03-26 19:14:16

标签: c# httpclient asp.net-web-api async-await c#-5.0

新的ASP.NET Web API HttpClient给了我一些奇怪的结果。这是我的代码:

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

这永远不会回来,控制台突然出现并消失。当我更改下面的代码时,它的工作原理应该是:

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

关于什么是问题的任何想法?

1 个答案:

答案 0 :(得分:9)

在VS11 / .NET 4.5编译器中不允许在async上{p> Main,所以我假设您正在使用Async CTP。如果可以选择使用.NET 4.5,请进行切换。

除此之外,它不起作用的原因是因为async或更一般地说,任务依赖于能够以某种方式发出信号以便执行剩余的代码。它适用于.Result,因为代码同步运行,因此问题不适用。

没有对控制台应用程序的内置支持,因为它们通常不像WinForms那样使用消息循环,但是你可以查看Microsoft Visual Studio Async CTP\Samples\(C# Testing) Unit Testing\AsyncTestUtilities,特别是GeneralThreadAffineContext.cs,获得一个在控制台应用程序中工作的基本示例。