HttpClient GetStringAsync - 它永远不会回来

Posted

技术标签:

【中文标题】HttpClient GetStringAsync - 它永远不会回来【英文标题】:HttpClient GetStringAsync - It never comes back 【发布时间】:2012-03-26 19:14:16 【问题描述】:

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

你知道会是什么问题吗?

【问题讨论】:

那甚至无法编译。入口点 (Main) 不能是异步的。它将因 CS4009 错误而失败。 @vcsjones 在异步 CTP 中是允许的(但这是个坏主意) @hvd 有趣。最好他们现在不允许这样做。 谢谢大家,我正在尝试查看该应用程序是否有效。因此,控制台应用程序只是一个测试。但很高兴知道这一点。我会在别的地方试试这个。 同样的想法也适用于单元测试。只要确保使用async Task 而不是async void。后者是一种即发即弃的形式。 【参考方案1】:

Main 上的async 在 VS11/.NET 4.5 编译器中是不允许的,所以我假设您使用的是异步 CTP。如果完全可以选择使用 .NET 4.5,请进行切换。

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

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

【讨论】:

以上是关于HttpClient GetStringAsync - 它永远不会回来的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient GetStringAsync - 它永远不会回来

HttpClient->GetStringAsync() 为 https Uris 抛出 0x000006F4

HttpClient GetStringAsync 返回 301,但浏览器能够导航到正确的地址

如何在 C# 中包装 HttpClient 以实现可测试性

Xamarin PCL 项目中的 HttpClient 访问失败

GetStringAsync 持续时间过长且永不返回