2013-12-17 31 views
4

當我在控制檯應用程序中調用下面的函數時,它才起作用。但是當我將其添加到MVC控制器時,執行永遠不會到達JsonConvert行。任何想法,我錯過了什麼。在MVC應用程序中使用httpclient

調用代碼

GetVersion(url).Result.FileVersion 

方法

public static async Task<Version> GetVersion(string url, string hostHeader) 
{ 
    var client = new HttpClient(); 
    if (!string.IsNullOrEmpty(hostHeader)) 
    { 
     client.DefaultRequestHeaders.Host = hostHeader; 
    } 
    var version = await client.GetStringAsync(url); 
    var output = JsonConvert.DeserializeObject<Version>(version); 
    client.Dispose(); 
    return output; 
} 
+0

哪個版本的MVC您使用的是? – ckv

+0

MVC4,.net4.5,vs2012 – ragche

回答

8

您造成的僵局,因爲我explain on my blog。默認情況下,await捕獲一個「上下文」(在本例中爲ASP.NET請求上下文),並使用該上下文恢復async方法。 ASP.NET請求上下文一次只允許一個線程,並且您通過調用Result來阻止該線程,從而阻止完成async方法。

您的控制檯應用程序沒有死鎖,因爲它沒有「上下文」,所以async方法在線程池上恢復。

的解決辦法是改變調用代碼使用方法:

(await GetVersion(url)).FileVersion 
+0

謝謝,這個作品。我會詳細閱讀您的博客以瞭解更多 – ragche