HttpClient GetStringAsync - 它永远不会返回

5
新的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
那甚至无法编译。入口点(Main)不能是异步的。它将失败并显示CS4009错误。 - vcsjones
@vcsjones 在 Async CTP 中是允许的(但不是一个好主意) - user743382
1
@hvd 有趣。最好现在禁止它。 - vcsjones
谢谢大家,我正在尝试查看这个应用程序是否工作。所以,控制台应用程序只是一个测试。但很高兴知道这一点。我会在其他地方试试。 - tugberk
对于单元测试也是同样的想法。只需确保使用 async Task 而不是 async void。后者是一种“点火并忘记”的形式。 - user29439
请参考此答案--https://dev59.com/pIfca4cB1Zd3GeqPot5M#28518326 - Ranjithkumar
1个回答

9
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,以获得在控制台应用程序中也可行的基本示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接