
不久前,典型的個人計算機的cpu還隻有一個計算核心,并且功耗足以煎熟雞蛋。2005年,英特爾推出了其首款多核心cpu,從此計算機開始向不同的方向發展。低耗電量及多個計算核心變得比提高行計算(row computing)的核心性能更重要。這也導緻了程式設計範式的改變。現在我們需要學習如何有效地使用所有cpu核心來最優化性能,并同時通過在特定時間隻運作需要的程式來節省電池電量。除此之外,我們在編寫伺服器端應用程式時需要有效地利用多個cpu核心,甚至多台計算機來支援盡可能多的使用者。
為了建立這樣的應用程式,你需要學習如何在程式中有效地使用多個cpu核心。如果你使用的是microsoft .net開發平台以及c#程式設計語言,那麼本書将是一個編寫高性能、高響應性的應用程式的完美起點。
本書的目的是給你提供c#中多線程以及并行程式設計的詳盡指導。我們将從基本概念開始,每章主題比前一章都有所拔高,最後展示現實世界中的并行程式設計模式以及通用windows應用和跨平台應用示例。
本書内容
第1章介紹了c#中基本的線程操作。本章解釋了什麼是線程,使用線程的優缺點,以及與線程相關的其他重要方面。
第2章描述了線程互動細節。你将了解為何我們需要協調線程,以及協調組織線程的不同方式。
第3章解釋了線程池概念。本章展示了如何使用線程池,如何執行異步操作,以及使用線程池的好的和不好的實踐。
第4章深入講解了任務并行庫(task parallel library,tpl)架構。本章講述了tpl的所有重要方面,包括任務組合、異常管理及取消操作等。
第5章深入解釋了最近引入的c#特性——異步方法。你将了解async和await關鍵字,如何在不同的場景中使用它們,以及await的底層工作機制。
第6章描述了.net架構中并行算法的标準資料結構,并為每種資料結構展示了示例程式設計場景。
第7章深入講解了并行linq基礎設施。本章講述了任務和資料并行度、并行化linq查詢、調整并行選項、分割查詢和集合并行查詢結果等内容。
第8章解釋了如何以及何時使用reactive extensions架構。你将學習如何組合事件,如何對事件序列執行linq查詢等。
第9章深入講解了異步i/o程序,包括檔案、網絡及資料庫等場景。
第10章列出了針對常見的并行程式設計問題的解決方案。
第11章講述了為windows10、os x,以及linux編寫異步應用程式。你将學習如何使用windows 10異步api,以及如何在windows商店應用中完成背景工作。你也會熟悉跨平台的.net開發工具群組件。
準備事項
我們需要microsoft visual studio社群版2015來完成大多數章節的學習。在第11章中,對于os x和linux可能需要visual studio code編輯器,當然你也可以使用任何你熟悉的編輯工具。
讀者對象
本書的讀者對象為沒有或隻有少量多線程及異步和并發程式設計背景的c#開發人員。本書涵蓋了c#和.net生态系統中從基礎概念到複雜程式設計模式及算法的很多與多線程相關的主題。
下載下傳示例代碼
[第1章 線程基礎
<a href="https://yq.aliyun.com/articles/90181/">1.2 使用c#建立線程</a>
1.2.1 準備工作
1.2.2 實作方式
1.2.3 工作原理
<a href="https://yq.aliyun.com/articles/90189/">1.3 暫停線程</a>
1.3.1 準備工作
1.3.2 實作方式
1.3.3 工作原理
<a href="https://yq.aliyun.com/articles/90194/">1.4 線程等待</a>
1.4.1 準備工作
1.4.2 實作方式
1.4.3 工作原理
<a href="https://yq.aliyun.com/articles/90205/">1.5 終止線程</a>
1.5.1 準備工作
1.5.2 實作方式
1.5.3 工作原理
<a href="https://yq.aliyun.com/articles/90212/">1.6 檢測線程狀态</a>
1.6.1 準備工作
1.6.2 實作方式
1.6.3 工作原理
<a href="https://yq.aliyun.com/articles/90219/">1.7 線程優先級</a>
1.7.1 準備工作
1.7.2 實作方式
1.7.3 工作原理
<a href="https://yq.aliyun.com/articles/90227/">1.8 前台線程和背景線程</a>
1.8.1 準備工作
1.8.2 實作方式
1.8.3 工作原理
<a href="https://yq.aliyun.com/articles/90242/">1.9 向線程傳遞參數</a>
1.9.1 準備工作
1.9.2 實作方式
1.9.3 工作原理
1.9.4 更多資訊
<a href="https://yq.aliyun.com/articles/90253/">1.10 使用c#中的lock關鍵字</a>
1.10.1 準備工作
1.10.2 實作方式
1.10.3 工作原理
<a href="https://yq.aliyun.com/articles/90256/">1.11 使用monitor類鎖定資源</a>
1.11.1 準備工作
1.11.2 實作方式
1.11.3 工作原理
<a href="https://yq.aliyun.com/articles/90260/">1.12 處理異常</a>
1.12.1 準備工作
1.12.2 實作方式
1.12.3 工作原理
[第2章 線程同步
<a href="https://yq.aliyun.com/articles/90284/">2.2 執行基本的原子操作</a>
2.2.1 準備工作
2.2.2 實作方式
2.2.3 工作原理
<a href="https://yq.aliyun.com/articles/90287/">2.3 使用mutex類</a>
2.3.1 準備工作
2.3.2 實作方式
2.3.3 工作原理
<a href="https://yq.aliyun.com/articles/90294/">2.4 使用semaphoreslim類</a>
2.4.1 準備工作
2.4.2 實作方式
2.4.3 工作原理
2.4.4 更多資訊
<a href="https://yq.aliyun.com/articles/90303/">2.5 使用autoresetevent類</a>
2.5.1 準備工作
2.5.2 實作方式
2.5.3 工作原理
<a href="https://yq.aliyun.com/articles/90306/">2.6 使用manualreseteventslim類</a>
2.6.1 準備工作
2.6.3 工作原理
2.6.4 更多資訊
<a href="https://yq.aliyun.com/articles/90313/">2.7 使用countdownevent類</a>
2.7.1 準備工作
2.7.2 實作方式
2.7.3 工作原理
<a href="https://yq.aliyun.com/articles/90323/">2.8 使用barrier類</a>
2.8.1 準備工作
2.8.2 實作方式
2.8.3 工作原理
<a href="https://yq.aliyun.com/articles/90335/">2.9 使用readerwriterlockslim類</a>
2.9.1 準備工作
2.9.2 實作方式
2.9.3 工作原理
<a href="https://yq.aliyun.com/articles/90348/">2.10 使用spinwait類</a>
2.10.1 準備工作
2.10.2 實作方式
2.10.3 工作原理
[第3章 使用線程池
<a href="https://yq.aliyun.com/articles/90369/">3.2 線上程池中調用委托</a>
3.2.1 準備工作
3.2.2 實作方式
3.2.3 工作原理
<a href="https://yq.aliyun.com/articles/90381/">3.3 向線程池中放入異步操作</a>
3.3.1 準備工作
3.3.2 實作方式
3.3.3 工作原理
<a href="https://yq.aliyun.com/articles/90385/">3.4 線程池與并行度</a>
3.4.1 準備工作
3.4.2 實作方式
3.4.3 工作原理
<a href="https://yq.aliyun.com/articles/90391/">3.5 實作一個取消選項</a>
3.5.1 準備工作
3.5.2 實作方式
3.5.3 工作原理
<a href="https://yq.aliyun.com/articles/90399/">3.6 線上程池中使用等待事件處理器及逾時</a>
3.6.1 準備工作
3.6.2 實作方式
3.6.3 工作原理
3.6.4 更多資訊
<a href="https://yq.aliyun.com/articles/90407/">3.7 使用計時器</a>
3.7.1 準備工作
3.7.2 實作方式
3.7.3 工作原理
<a href="https://yq.aliyun.com/articles/90424/">3.8 使用backgroundworker元件</a>
3.8.1 準備工作
3.8.2 實作方式
3.8.3 工作原理
第4章 使用任務并行庫
4.1 簡介
4.2 建立任務
4.2.1 準備工作
4.2.2 實作方式
4.2.3 工作原理
4.3 使用任務執行基本的操作
4.3.1 準備工作
4.3.2 實作方式
4.3.3 工作原理
4.4 組合任務
4.4.1 準備工作
4.4.2 實作方式
4.4.3 工作原理
4.5 将apm模式轉換為任務
4.5.1 準備工作
4.5.2 實作方式
4.5.3 工作原理
4.6 将eap模式轉換為任務
4.6.1 準備工作
4.6.2 實作方式
4.6.3 工作原理
4.7 實作取消選項
4.7.1 準備工作
4.7.2 實作方式
4.7.3 工作原理
4.8 處理任務中的異常
4.8.1 準備工作
4.8.2 實作方式
4.8.3 工作原理
4.8.4 更多資訊
4.9 并行運作任務
4.9.1 準備工作
4.9.2 實作方式
4.9.3 工作原理
4.10 使用taskscheduler配置任務的執行
4.10.1 準備工作
4.10.2 實作方式
4.10.3 工作原理
第5章 使用c# 6.0
5.1 簡介
5.2 使用await操作符擷取異步任務結果
5.2.1 準備工作
5.2.2 實作方式
5.2.3 工作原理
5.3 在lambda表達式中使用await操作符
5.3.1 準備工作
5.3.2 實作方式
5.3.3 工作原理
5.4 對連續的異步任務使用await操作符
5.4.1 準備工作
5.4.2 實作方式
5.4.3 工作原理
5.5 對并行執行的異步任務使用await操作符
5.5.1 準備工作
5.5.2 實作方式
5.5.3 工作原理
5.6 處理異步操作中的異常
5.6.1 準備工作
5.6.2 實作方式
5.6.3 工作原理
5.7 避免使用捕獲的同步上下文
5.7.1 準備工作
5.7.2 實作方式
5.7.3 工作原理
5.8 使用async void方法
5.8.1 準備工作
5.8.2 實作方式
5.8.3 工作原理
5.9 設計一個自定義的awaitable類型
5.9.1 準備工作
5.9.2 實作方式
5.9.3 工作原理
5.10 對動态類型使用await
5.10.1 準備工作
5.10.2 實作方式
5.10.3 工作原理
第6章 使用并發集合
6.1 簡介
6.2 使用concurrentdictionary
6.2.1 準備工作
6.2.2 實作方式
6.2.3 工作原理
6.3 使用concurrentqueue實作異步處理
6.3.1 準備工作
6.3.2 實作方式
6.3.3 工作原理
6.4 改變concurrentstack異步處理順序
6.4.1 準備工作
6.4.2 實作方式
6.4.3 工作原理
6.5 使用concurrentbag建立一個可擴充的爬蟲
6.5.1 準備工作
6.5.2 實作方式
6.5.3 工作原理
6.6 使用blockingcollection進行異步處理
6.6.1 準備工作
6.6.2 實作方式
6.6.3 工作原理
第7章 使用plinq
7.1 簡介
7.2 使用parallel類
7.2.1 準備工作
7.2.2 實作方式
7.2.3 工作原理
7.3 并行化linq查詢
7.3.1 準備工作
7.3.2 實作方式
7.3.3 工作原理
7.4 調整plinq查詢的參數
7.4.1 準備工作
7.4.2 實作方式
7.4.3 工作原理
7.5 處理plinq查詢中的異常
7.5.1 準備工作
7.5.2 實作方式
7.5.3 工作原理
7.6.1 準備工作
7.6.2 實作方式
7.6.3 工作原理
7.7 為plinq查詢建立一個自定義的聚合器
7.7.1 準備工作
7.7.2 實作方式
7.7.3 工作原理
第8章 使用reactive extensions
8.1 簡介
8.2 将普通集合轉換為異步的可觀察集合
8.2.1 準備工作
8.2.2 實作方式
8.2.3 工作原理
8.3 編寫自定義的可觀察對象
8.3.1 準備工作
8.3.2 實作方式
8.3.3 工作原理
8.4 使用subject
8.4.1 準備工作
8.4.2 實作方式
8.4.3 工作原理
8.5 建立可觀察的對象
8.5.1 準備工作
8.5.2 實作方式
8.5.3 工作原理
8.6 對可觀察的集合使用linq查詢
8.6.1 準備工作
8.6.2 實作方式
8.6.3 工作原理
8.7 使用rx建立異步操作
8.7.1 準備工作
8.7.2 實作方式
8.7.3 工作原理
第9章 使用異步i/o
9.1 簡介
9.2 異步地使用檔案
9.2.1 準備工作
9.2.2 實作方式
9.2.3 工作原理
9.3 編寫一個異步的http伺服器和用戶端
9.3.1 準備工作
9.3.2 實作方式
9.3.3 工作原理
9.4 異步操作資料庫
9.4.1 準備工作
9.4.2 實作方式
9.4.3 工作原理
9.5 異步調用wcf服務
9.5.1 準備工作
9.5.2 實作方式
9.5.3 工作原理
第10章 并行程式設計模式
10.1 簡介
10.2 實作惰性求值的共享狀态
10.2.1 準備工作
10.2.2 實作方式
10.2.3 工作原理
10.3 使用blockingcollection實作并行管道
10.3.1 準備工作
10.3.2 實作方式
10.3.3 工作原理
10.4 使用tpl資料流實作并行管道
10.4.1 準備工作
10.4.2 實作方式
10.4.3 工作原理
10.5 使用plinq實作map/reduce模式
10.5.1 準備工作
10.5.2 實作方式
10.5.3 工作原理
第11章 更多資訊
11.1 簡介
11.2 在通用windows平台應用中使用計時器
11.2.1 準備工作
11.2.2 實作方式
11.2.3 工作原理
11.3 在通常的應用程式中使用winrt
11.3.1 準備工作
11.3.2 實作方式
11.3.3 工作原理
11.4 在通用windows平台應用中使用backgroundtask
11.4.1 準備工作
11.4.2 實作方式
11.4.3 工作原理
11.5 在os x上運作.net核心應用程式
11.5.1 準備工作
11.5.2 實作方式
11.5.3 工作原理
11.6 在ubuntu linux上運作.net核心應用程式
11.6.1 準備工作
11.6.2 實作方式
11.6.3 工作原理