並行編程的使用場景:須要執行大量的計算任務,而且這些任務能分割成相互獨立的任務塊兒編程
並行的形式有兩種:數據並行(data parallelism)和任務並行(task parallelim)。promise
數據並行(data parallelism):有大量的數據須要處理,而且每一塊數據的處理過程基本上是彼此獨立的。服務器
任務並行(task parallelim):須要執行大量任務,而且每一個任務的執行過程基本上是彼此獨立的。任務並行能夠是動態的,若是一個任務的執行結果會產生額外的任務,這些新增的任務也能夠加入任務池。多線程
實現數據並行的方法併發
每一個任務塊要儘量的互相獨立。 只要任務塊是互相獨立的,並行性就能作到最大化。一旦你在多個線程中共享狀態,就必須以同步方式訪問這些狀態,那樣程序的並行性就變差了。異步
數據並行重點在處理數據,任務並行則關注執行任務。async
實現任務並行的方法函數式編程
一般狀況下,不必關心線程池處理任務的具體作法。數據並行和任務並行都使用動態調整的分割器,把任務分割後分配給工做線程。線程池在須要的時候會增長線程數量。線程池線程使用工做竊取隊列(work-stealing queue)。異步編程
使用場景:處理的事件中帶有參數,最好採用響應式編程
響應式編程的核心概念是:可觀察的流(observable stream)
響應式編程的最終代碼很是像 LINQ,能夠認爲它就是「LINQ to events」,它採用「推送」模式,事件到達後就自行穿過查詢。函數
異步編程和並行編程這兩種技術結合起來就是TPL數據流
數據流網格的基本組成單元是數據流塊(dataflow block)。
Rx 和 TPL有不少相同點。
網格和流都有「數據項」這一律念,數據項從網格或流的中間穿過。還有,網格和流都有「正常完成」(表示沒有更多數據須要接收時發出的通知)和「不正常完成」(在處理數據中發生錯誤時發出的通知)這兩個概念。可是,Rx 和 TPL 數據流的性能並不相同。
當須要執行須要計時的任務,最佳選擇是Rx的 可觀察流 observable 對象
當須要進行並行處理,最佳選擇是 TPL數據流塊
線程是一個獨立的運行單元,每一個進程內部有多個線程,每一個線程能夠各自同時執行指令。每一個線程有本身獨立的棧,可是與進程內的其餘線程共享內存。
對某些程序來講,其中有一個線程是特殊的,例如用戶界面程序有一個 UI 線程,控制檯程序有一個 main 線程。
每一個 .NET 程序都有一個線程池,線程池維護着必定數量的工做線程,這些線程等待着執行分配下來的任務。線程池能夠隨時監測線程的數量。配置線程池的參數多達幾十個,可是建議採用默認設置,線程池的默認設置是通過仔細調整的,適用於絕大多數現實中的應用場景。
大多數併發編程技術有一個相似點:它們本質上都是函數式(functional)的。函數式編程理念是併發編程的本質。