Asp.net-Mvc-4

使用非同步操作執行同步程式碼

  • November 30, 2015

我有一個搜尋操作,它有兩個路徑,一個是同步路徑,它只返回一個簡單的視圖,另一個是非同步路徑,它非同步執行搜尋,然後返回一個視圖。兩者都是 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 部分中。

引用自:https://stackoverflow.com/questions/9627329