在架構領域,我們經常聽見別人說“非同步”,另外大家在面試中也經常會遇到這方面的問題。
說到.NET非同步,先來說幾個比較容易混淆的概念:
1、多執行緒:一般指同一程序中多個執行緒協作執行。在多核計算機中多個執行緒將有機會同時運行於多個核上,如果執行緒中進行的是計算,則行成平行計算。
2、並行:一般指平行計算,是說同一時刻有多條指令同時被執行,這些指令可能執行於同一CPU的多核上,或者多個CPU上,或者多個物理主機甚至多個網路中。
3、非同步:與同步相對應,是指呼叫另一操作後,不等待其結果,繼續執行之後的操作,若之後沒有其他操作,當前執行緒將進入睡眠狀態,而CPU時間將有機會切至其他執行緒。在非同步操作完成後透過回撥函式的方式獲取通知與結果。
在 web 應用程式看到大量在啟動時的併發請求或具有突發負載 (其中會增加併發情況突然),進行非同步 web 服務呼叫將增加你的應用程式的響應能力。 非同步請求採用相同量的時間來處理與同步請求。
例如,如果某個請求生成 web 服務呼叫,則需要兩秒鐘來完成,請求所執行的兩秒內是否執行同步或非同步。 但是,在非同步呼叫,執行緒則無需必須等待第一個請求完成時響應其他請求。 因此,非同步請求可以防止出現請求排隊和執行緒池增長時有許多併發請求呼叫長時間執行的操作。
非同步的實現方式有多種,比如多執行緒。多執行緒將非同步操作放入另一執行緒中執行,透過輪詢或回撥方法得到完成通知。
多執行緒實現非同步呼叫可以採用傳統的Thread類來實現,Task來實現以及 async/await 關鍵字實現。
對於Thread來說,當多個非同步方法需要協助時,程式碼將顯得十分複雜,為此我們需要一個更好的非同步模型,從.NET4開始,引入了新的非同步模型。下面來看一段程式碼:
我們不再關心任務如何去開始,何時會結束,一切變成了一些有關或無關的任務。
對於封裝一個由多個非同步方法組合成的非同步方法, 組合非同步方法呼叫後,按順序呼叫第一個非同步方法,緊接著,產生需要的結果Task後返回。非同步方法完成時回撥指定的方法,並按順序繼續呼叫,所有方法完成後,把執行的最終結果設定給結果Task,那麼整個任務即完成。 如果非同步方法有返回值,那麼組合的非同步方法看上去會複雜一點。類似下圖所示:
為了解決這個問題,微軟提供了一個非常好用的語法糖:async/await 關鍵字。下面我們來看一段程式碼:
他幾乎和同步方法書寫一致,程式碼量也比較少,程式的邏輯也很清晰,當然可讀性更強。
關於.NET網站非同步處理分享到這裡,這裡做個總結:
1、.NET網站非同步處理可以採用3中方式實現:Thread,Task,async/await;
2、Task出現是為了Thread的不足,async/await出現也是為了彌補Task的不足。大家有沒有發現這個關係就像一條線一樣。其實說到底這些都是多執行緒技術,底層都是Thread實現,只不過微軟為了程式碼的可讀性以及邏輯的清晰性,做了語法糖,從而更加方便開發人員使用。
3、在C#5中,添加了 async/await 關鍵字,使得上面遺留的問題得以解決,而且重點是,用起來非常簡單!
4、NET Framework 4 引入了非同步程式設計概念, ASP.NET 4.5 支援任務, 於是就有了async/await 。
在架構領域,我們經常聽見別人說“非同步”,另外大家在面試中也經常會遇到這方面的問題。
什麼是非同步?說到.NET非同步,先來說幾個比較容易混淆的概念:
1、多執行緒:一般指同一程序中多個執行緒協作執行。在多核計算機中多個執行緒將有機會同時運行於多個核上,如果執行緒中進行的是計算,則行成平行計算。
2、並行:一般指平行計算,是說同一時刻有多條指令同時被執行,這些指令可能執行於同一CPU的多核上,或者多個CPU上,或者多個物理主機甚至多個網路中。
3、非同步:與同步相對應,是指呼叫另一操作後,不等待其結果,繼續執行之後的操作,若之後沒有其他操作,當前執行緒將進入睡眠狀態,而CPU時間將有機會切至其他執行緒。在非同步操作完成後透過回撥函式的方式獲取通知與結果。
在Web中為什麼要使用非同步?在 web 應用程式看到大量在啟動時的併發請求或具有突發負載 (其中會增加併發情況突然),進行非同步 web 服務呼叫將增加你的應用程式的響應能力。 非同步請求採用相同量的時間來處理與同步請求。
例如,如果某個請求生成 web 服務呼叫,則需要兩秒鐘來完成,請求所執行的兩秒內是否執行同步或非同步。 但是,在非同步呼叫,執行緒則無需必須等待第一個請求完成時響應其他請求。 因此,非同步請求可以防止出現請求排隊和執行緒池增長時有許多併發請求呼叫長時間執行的操作。
非同步的實現方式非同步的實現方式有多種,比如多執行緒。多執行緒將非同步操作放入另一執行緒中執行,透過輪詢或回撥方法得到完成通知。
多執行緒實現非同步呼叫可以採用傳統的Thread類來實現,Task來實現以及 async/await 關鍵字實現。
對於Thread來說,當多個非同步方法需要協助時,程式碼將顯得十分複雜,為此我們需要一個更好的非同步模型,從.NET4開始,引入了新的非同步模型。下面來看一段程式碼:
我們不再關心任務如何去開始,何時會結束,一切變成了一些有關或無關的任務。
對於封裝一個由多個非同步方法組合成的非同步方法, 組合非同步方法呼叫後,按順序呼叫第一個非同步方法,緊接著,產生需要的結果Task後返回。非同步方法完成時回撥指定的方法,並按順序繼續呼叫,所有方法完成後,把執行的最終結果設定給結果Task,那麼整個任務即完成。 如果非同步方法有返回值,那麼組合的非同步方法看上去會複雜一點。類似下圖所示:
為了解決這個問題,微軟提供了一個非常好用的語法糖:async/await 關鍵字。下面我們來看一段程式碼:
他幾乎和同步方法書寫一致,程式碼量也比較少,程式的邏輯也很清晰,當然可讀性更強。
總結關於.NET網站非同步處理分享到這裡,這裡做個總結:
1、.NET網站非同步處理可以採用3中方式實現:Thread,Task,async/await;
2、Task出現是為了Thread的不足,async/await出現也是為了彌補Task的不足。大家有沒有發現這個關係就像一條線一樣。其實說到底這些都是多執行緒技術,底層都是Thread實現,只不過微軟為了程式碼的可讀性以及邏輯的清晰性,做了語法糖,從而更加方便開發人員使用。
3、在C#5中,添加了 async/await 關鍵字,使得上面遺留的問題得以解決,而且重點是,用起來非常簡單!
4、NET Framework 4 引入了非同步程式設計概念, ASP.NET 4.5 支援任務, 於是就有了async/await 。