2015-03-02 35 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