ASP.NET MVC 異步控制器及EF異步操作
異步控制器
- ASP.NET MVC2后開始了對異步請求管道的支持,異步請求管道的作用是允許web服務器處理長時間運行的請求,比如
那些花費大量時間等待網絡或數據庫操作完成的請求仍能保持對其他請求的響應;所以異步主要是高效率而不是提高一個
單獨請求的響應速度,盡管異步花費了與同步一樣的事件響應用戶請求,但在異步管道中,服務器不會因為在等待一個請求
的完成而阻塞其他有用的任務執行
- 理解異步和同步ASP.NET代碼的區別
- 首先理解web服務器是如何處理請求的。IIS維護了一個用來服務請求的空閑線程的集合(線程池)。當一個請求進入時,
線程池中的一個線程就別調度用來處理進入的請求。當一個線程正在處理一個請求時,他就不能用來處理其他的請求,直到他
完成第一個請求的處理。IIS同時服務多個請求的能力是基於一個假設:線程池中有空閑的線程來處理進入的請求
- 阻塞線程
- 線程正在等待網絡調用完成,因此不能用來執行當前請求的其他任務
- 線程飢餓
- 只要線程池足夠大的話,阻塞線程並不是什么大問題;然而在處理多個並發請求的大型應用程序中,可能會因為請求的數量過多而導致
等待數據的請求也多而阻塞了大量的線程,從而導致線程池沒有足夠的空閑線程來處理新的請求
- 語法
public async Task<ActionResult> News(string city)
{
NewService newService=new NewService();
NewsModel news=await newsService.GetNews(city);
return View(news);
}
- 相比同步操作,只需做三處改動:為操作添加async修飾符,返回類型改為Task
,在需要長時間運行的方法前添加await
EF的異步操作
- 增

- Add方法只是導致實體在內存中的修改,SaveChanges方法才是導致命令執行,所以SaveChanges要異步執行
- 刪

- Find方法使查詢被發送到數據庫進行檢索,所以Find方法要異步執行
- 查

- pageData語句只是設置為一個查詢語句,並沒有執行,直到調用.ToList才會將數據從數據庫中
查詢並加載在內存中,所以ToList方法要異步執行
- 改

- FirstOrDefault方法返回的是序列的第一個元素或默認值,是向數據庫中發起了請求,所以
該方法要異步執行
同步or異步
- 同步
- 操作簡單或者能在短時間內執行完畢
- 簡單性和可測試性
- 操作是CPU密集型,而非IO密集型
- 異步
- 阻塞的操作
- 一種可以讓用戶取消長時間運行的請求的機制
- 操作是IO密集型,而非CPU密集型
以上內容部分摘抄自《ASP.NET MVC 5》