我试图理解描述相同内容的两篇文章中的差异的原因(调用JSON rest webservice)。
第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;
我的困惑不在于调用的异步性质,我理解await语句的功能。我的困惑源于CodeProject示例末尾的.Result(BTW代码项目示例对我有用)以及Microsoft文章没有它们的事实。
如果我复制Microsoft文章代码,我会收到编译器警告,希望我在返回类型周围添加Task。我错过了什么?
由于
答案 0 :(得分:1)
ABCAsync
方法返回Task<something>
以封装可能失败/已完成/挂起操作的状态。一旦操作完成,返回的值Result
属性将包含实际的返回值。
通过编译器支持 - await
关键字 - 编译器隐藏了这个细节。
因此使用await
只能看到操作的结果(Task<T>
实例被隐藏),但是当不使用编译器支持时,你必须处理细节。
NB。任务未完成时访问Task<T>.Result
将阻止;如果它失败了那么它会抛出。因此
var x = obj.ABCAsync().Result;
非常类似于调用方法的阻止版本;但是有了编译器助手的额外开销。