2015-03-02 33 views
0

我想了解在两篇文章描述了同样的事情(调用JSON休息Web服务)的差异的原因。HttpClient的文档混乱(JSON休息Web服务)

第1条:Calling a Web API From a .NET Client in ASP.NET Web API 2

第2条:Calling ASP.NET WebAPI using HttpClient

的区别是:

HttpResponseMessage response = await client.GetAsync("api/products/1"); 

vs 

HttpResponseMessage response = client.GetAsync(url).Result; 

Product product = await response.Content.ReadAsAsync>Product>(); 

vs 

var users = response.Content.ReadAsAsync<Users>().Result; 

我的困惑是不是与调用的异步特性我了解这个功能等待声明。我的困惑源于CodeProject示例结尾处的结果(顺便说一下,代码项目示例适用于我)以及Microsoft文章没有它们的事实。

如果我复制微软的文章的代码,我得到编译器警告要我添加任务在我的返回类型。我错过了什么?

感谢

+0

[异步调用异步方法]的可能的重复(http://stackoverflow.com/questions/22628087/calling-async-method-synchronously) – CodeCaster 2015-03-02 14:08:23

+0

这与WebAPI或HttpClient无关,但与async/await无关。在同步调用中,您可以使用'.Result'来同步获取异步调用的结果。参见[同步调用异步方法](http://stackoverflow.com/questions/22628087/calling-async-method-synchronously)。 – CodeCaster 2015-03-02 14:09:34

回答

1

ABCAsync方法返回一个Task<something>封装可能失败的/完成/挂起的操作状态。一旦操作完成,返回值Result属性将包含实际返回值。

随着编译器支持 - await关键字 - 编译器隐藏这个细节。

因此使用await您只会看到操作的结果(隐藏了Task<T>实例),但是如果不使用编译器支持,则必须处理细节。

注意:当任务尚未完成时访问Task<T>.Result将会阻塞;如果它失败了,它会抛出。因此,

var x = obj.ABCAsync().Result; 

的行为非常像调用该方法的阻塞版本;但带有编译器助手的额外开销。

+0

谢谢,现在很清楚。 – Talib 2015-03-02 14:23:45