Asp.net-Mvc-4
使用非同步操作執行同步程式碼
我有一個搜尋操作,它有兩個路徑,一個是同步路徑,它只返回一個簡單的視圖,另一個是非同步路徑,它非同步執行搜尋,然後返回一個視圖。兩者都是 GET 請求,因此它們是同一操作的一部分。
問題是當我訪問操作“localhost:XXXX/Home/Search”時,頁面只是無限載入。使用 Fiddler,我可以看到請求永遠不會返回。我已經對其進行了調試,它到達了最後一行程式碼,但是,請求再次沒有完成。
我已將複製簡化為以下內容:
public async Task<ActionResult> Search() { return View(); }VS11 警告我程式碼將在沒有等待的情況下同步執行,這很好,但請求沒有完成。
這應該工作嗎?還是我需要在這裡做點別的?
編輯
這是針對 .NET 4.5 的 MVC 4。
編輯 2
對於那些在程式碼中看得更清楚的人,這就是我需要在非同步操作中同步的原因:
public async Task<ActionResult> Search(string query = null) { if (string.IsNullOrWhiteSpace(query)) return View(new SearchViewModel()); // never loads var model = await _someService.SearchAsync(query); return View(model); // loads }
這是測試版中的一個已知錯誤。引用斯蒂芬·圖布的話:
簡短的回答是 .NET 4.5 Beta 中的 ASP.NET MVC 中存在一個已知錯誤,當非同步方法同步完成時會導致此問題。在修復可用之前,一個簡單的解決方法是添加“await Task.Yield();” 作為 async 方法的第一行,強制它非同步完成。為了使其正常工作,您還需要確保使用 .NET 4.5 中 ASP.NET 提供的新 SynchronizationContext,這意味著確保您擁有以下行:
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />在配置文件的 appSettings 部分中。