HttpClient GetStringAsync-它永远不会回来

本文关键字:回来 永远 GetStringAsync- HttpClient | 更新日期: 2023-09-27 18:29:01

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

有什么想法吗?

HttpClient GetStringAsync-它永远不会回来

Main上的async在VS11/.NET 4.5编译器中是不允许的,所以我假设您使用的是Async CTP。如果使用.NET 4.5完全是一种选择,那么一定要进行切换。

除此之外,它之所以不起作用,是因为async,或者更普遍地说,任务,依赖于能够以某种方式发出信号,让代码的其余部分得以执行。它与.Result一起工作,因为代码是同步运行的,所以问题不适用。

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