一直想把項目改寫成異步,可是ASP.NETMVC3下寫的過於繁瑣,.NET 4.5與ASP.NET MVC下代碼寫起來就比較簡單了, MS好像也一直喜歡這樣搞,每個成熟的東西,都要演變好幾個版本,才能趨於規範。 ASP.NET MVC 中爲何須要使用異步呢,IIS有一個線程池來處理用戶的請求,當一個新的請求過來時,將調度池中的線程以處理該請求,然而,但併發量很高的狀況下,池中的線程已經不可以知足這麼多的請求時候,池中的每個線程都處於忙的狀態則在處理請求時將阻塞處理請求的線程,而且該線程不能對另外一個請求提供服務,若是請求隊列已滿,則 Web 服務器會拒絕請求並處於 HTTP 503繁忙狀態。若是是處理一些高延遲,例如網絡操做,這樣的線程大多數只是等待狀態大部分時間是不作任何事情的,這樣的線程就可使用異步編程更好的充分利用。 html
例如:若是某個請求生成一個須要兩秒鐘來完成的網絡調用,則該請求不管是同步執行仍是異步執行都須要兩秒鐘。 可是,在異步調用的過程當中,服務器在等待第一個請求完成的過程當中不會阻塞對其餘請求的響應。 所以,當有許多請求調用長時間運行的操做時,異步請求能夠防止出現請求排隊的狀況。在.NET 4.5中最大線程池爲 5000 .NET 4.5中也增長了 await與async關鍵字來簡化異步編程。 編程
一般,在知足如下條件時使用同步管線: 服務器
操做很簡單或運行時間很短。網絡
簡單性比效率更重要。併發
此操做主要是 CPU 操做而不是包含大量的磁盤或網絡開銷的操做。 對 CPU 綁定操做使用異步操做方法未提供任何好處而且還致使更多的開銷。異步
一般,在知足如下條件時使用異步管線: async
操做是網絡綁定的或 I/O 綁定的而不是 CPU 綁定的。異步編程
測試顯示阻塞操做對於網站性能是一個瓶頸,而且經過對這些阻塞調用使用異步操做方法,IIS 可對更多的請求提供服務。性能
並行性比代碼的簡單性更重要。測試
您但願提供一種可以讓用戶取消長時間運行的請求的機制。
ASP.NET MVC 中使用異步控制器
#region 一、異步請求 [AsyncTimeout(1000)] public async Task<ActionResult> Index() { var data = await GetPageTaskAsync("http://163.com"); return data; } public async Task<ActionResult> GetPageTaskAsync(string url) { try { using (var client = new HttpClient()) { await Task.Delay(3000); var fetchTextTask = client.GetStringAsync(url); return Json(new { fetchText = await fetchTextTask,error="NO" },JsonRequestBehavior.AllowGet); } } catch (WebException ex) { throw ex; } } #endregion