c#異步編程(三)—ASP.NET MVC 異步控制器及EF異步操做

ASP.NET MVC 異步控制器及EF異步操做

異步控制器

  • ASP.NET MVC2後開始了對異步請求管道的支持,異步請求管道的做用是容許web服務器處理長時間運行的請求,好比
    那些花費大量時間等待網絡或數據庫操做完成的請求仍能保持對其餘請求的響應;因此異步主要是高效率而不是提升一個
    單獨請求的響應速度,儘管異步花費了與同步同樣的事件響應用戶請求,但在異步管道中,服務器不會由於在等待一個請求
    的完成而阻塞其餘有用的任務執行
  1. 理解異步和同步ASP.NET代碼的區別
  • 首先理解web服務器是如何處理請求的。IIS維護了一個用來服務請求的空閒線程的集合(線程池)。當一個請求進入時,
    線程池中的一個線程就別調度用來處理進入的請求。當一個線程正在處理一個請求時,他就不能用來處理其餘的請求,直到他
    完成第一個請求的處理。IIS同時服務多個請求的能力是基於一個假設:線程池中有空閒的線程來處理進入的請求
  1. 阻塞線程
  • 線程正在等待網絡調用完成,所以不能用來執行當前請求的其餘任務
  1. 線程飢餓
  • 只要線程池足夠大的話,阻塞線程並非什麼大問題;然而在處理多個併發請求的大型應用程序中,可能會由於請求的數量過多而致使
    等待數據的請求也多而阻塞了大量的線程,從而致使線程池沒有足夠的空閒線程來處理新的請求
  1. 語法



    public async Task&ltActionResult&gt News(string city)
    {
    NewService newService=new NewService();
    NewsModel news=await newsService.GetNews(city);
    return View(news);
    }
  • 相比同步操做,只需作三處改動:爲操做添加async修飾符,返回類型改成Task ,在須要長時間運行的方法前添加await git

    EF的異步操做


  • Add方法只是致使實體在內存中的修改,SaveChanges方法纔是致使命令執行,因此SaveChanges要異步執行

  • Find方法使查詢被髮送到數據庫進行檢索,因此Find方法要異步執行

  • pageData語句只是設置爲一個查詢語句,並無執行,直到調用.ToList纔會將數據從數據庫中
    查詢並加載在內存中,因此ToList方法要異步執行

  • FirstOrDefault方法返回的是序列的第一個元素或默認值,是向數據庫中發起了請求,因此
    該方法要異步執行

同步or異步

  1. 同步
  • 操做簡單或者能在短期內執行完畢
  • 簡單性和可測試性
  • 操做是CPU密集型,而非IO密集型
  1. 異步
  • 阻塞的操做
  • 一種可讓用戶取消長時間運行的請求的機制
  • 操做是IO密集型,而非CPU密集型

以上內容部分摘抄自《ASP.NET MVC 5》

代碼GitHub地址

相關文章
相關標籤/搜索