2015-02-07 64 views
1

我有一個ASP.NET MVC站點和一個Web API。 在MVC網站,我做的控制器動作:C#中的異步調用不返回結果

public ActionResult ActionAsync() 
{ 
    string result = MakeAsyncRequest().Result; 
    return View("Index", (object)result); 
} 

MakeAsyncRequest()如下:

private async Task<string> MakeAsyncRequest() 
{ 
    using (var client = new HttpClient()) 
    { 
     Task<string> response = client.GetStringAsync("http://localhost:55286/api/Home"); 
     DoSomething(); 
     return await response; 
    } 
} 

當我調試我看到正在執行DoSomething的()(它只是一個無效), WebAPI也被調用並返回一個字符串,但是這時MakeAsyncRequest的返回不會發生,並且瀏覽器會無限期地等待服務器返回一些東西。

這是爲什麼?與客戶端是ASP.NET MVC網站有什麼關係?

+1

'DoSomething()'返回嗎?當您暫停調試器時,您在線程窗口中看到了什麼? – CodeCaster 2015-02-07 18:19:28

+0

在旁註中 - 我將放棄'async'函數修飾符並返回'response'而不等待它。您付出的代價很小,在這種情況下,它不會帶來任何好處。 – twoflower 2015-02-07 18:21:35

+0

如果在這種情況下在輸出窗口 – MichaelLo 2015-02-07 18:22:45

回答

5

.Result

這是一個classic ASP.NET deadlock.不要阻塞。或者,不要使用異步/等待,但你的情況似乎是一個不錯的選擇。使操作同步。

+0

啊...所以,ASP.NET使用同步上下文?很高興知道! (我知道......大概幾乎每個人實際上已經知道ASP.NET,但我沒有:p) – 2015-02-07 18:47:23

+0

@PeterDuniho - 我相信* async/await *使用同步上下文。它不是ASP.NET獨有的。我可能是錯的,雖然... – Tim 2015-02-07 18:50:39

+0

這沒有把戲。感謝您的回覆和鏈接。乾杯! – Dante 2015-02-07 18:58:28