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,但浏览器能够导航到正确的地址