-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

并行編程實戰——基于C# 8和.NET Core 3

( 簡體 字)
作者:[印]沙克蒂·坦沃 著 類別:1. -> 程式設計 -> .NET -> C#
譯者:馬琳琳 譯
出版社:清華大學出版社并行編程實戰——基于C# 8和.NET Core 3 3dWoo書號: 54973
詢問書籍請說出此書號!

缺書
NT售價: 495

出版日:7/1/2021
頁數:290
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787302581826
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

Packt出版社大約一年前首次與我聯系,約稿撰寫本書。經過一段漫長的寫作過程,本書的編寫終于完成,雖然比我預期的要難,但是在此過程中我也學習到了很多知識。你現在看到的圖書是我經過許多漫長日子、辛勤工作的結晶,我很自豪最終能將它呈現在你的面前。
編寫一本有關C#的圖書對我來說意義重大,因為在我的職業生涯中,C#是我使用最為嫻熟的語言,撰寫一本和它有關的圖書是我一直以來的夢想。自從C#面世以來,它確實有了長足的發展,而.NET Core的出現也增強了C#在開發人員社區中的聲譽。
為了使本書對廣大讀者更有意義,我們將同時討論經典的線程模型和任務并行庫(TPL),并通過代碼進行更詳細的解釋。我們將首先研究操作系統和多線程代碼編寫方面的基本概念,然后仔細探討經典線程和TPL之間的區別。
本書的編寫方式力求易于學習,并注意在當前最佳編程實踐的背景下進行并行編程。本書示例簡短明了,即使你沒有太多的先驗知識也很容易理解。
希望你能喜歡閱讀本書,就像我喜歡撰寫本書一樣。
本書讀者
本書適用于希望學習多線程和并行編程概念,并想在使用.NET Core構建的企業應用程序中使用它們的C#程序員。如果你是學生或專業人士,想理解并行編程與現代硬件的結合方式,那么本書也很適合你。
本書假定你已經熟悉C#編程語言和操作系統相關基礎知識。
內容介紹
本書共包括5篇14章,具體內容如下。
? 第1篇:線程、多任務和異步基礎,包括第1∼4章。
? 第1章“并行編程簡介”,闡釋多線程和并行編程的重要概念。本章還介紹操作系統的發展以及現代并行編程結構。
? 第2章“任務并行性”,演示如何將程序劃分為任務,包括將APM模式和EAP模式轉換為任務,以有效利用CPU資源和提高程序性能。
? 第3章“實現數據并行”,重點介紹使用并行循環實現數據并行性。本章還介紹有助于實現并行性的擴展方法以及分區策略。
? 第4章“使用PLINQ”,說明如何利用PLINQ支持,這包括排序查詢和取消查詢。另外,本章還討論影響PLINQ性能的因素。
? 第2篇:支持.NET Core中并行性的數據結構,包括第5∼7章。
? 第5章“同步原語”,介紹C#中可用的同步結構,包括互鎖操作、鎖原語、信號原語、屏障和倒數事件、自旋鎖等,使用它們可以處理多線程代碼中的共享資源。
? 第6章“使用并發集合”,描述如何利用.NET Core中可用的并發集合,而不必擔心手動同步編碼的問題。
? 第7章“通過延遲初始化提高性能”,闡釋延遲初始化的概念,并探討如何使用延遲模式實現內置構造,以及如何減少延遲初始化的開銷。
? 第3篇:使用C#進行異步編程,包括第8章和第9章。
? 第8章“異步編程詳解”,探討如何在早期版本的.NET中編寫異步代碼,并討論適合使用異步編程的情形和不宜使用異步編程的情形。
? 第9章“基于任務的異步編程基礎”,介紹如何利用.NET Core中的新結構(async和await關鍵字)來實現異步代碼。
? 第4篇:異步代碼的調試、診斷和單元測試,包括第10章和第11章。
? 第10章“使用Visual Studio調試任務”,重點介紹Visual Studio 2019中可用的各種工具,這些工具使調試并行任務更加容易。
? 第11章“編寫并行和異步代碼的單元測試用例”,介紹在Visual Studio和.NET Core中編寫單元測試用例的各種方法。
? 第5篇:.NET Core附加的并行編程功能,包括第12∼14章。
? 第12章“ASP.NET Core中的IIS和Kestrel”,介紹IIS和Kestrel線程模型。本章還探討微服務中線程的最佳實踐以及對異步流的支持。
? 第 13 章“并行編程中的模式”,介紹用 C#語言實現的各種模式。包括MapReduce映射和歸約、聚合、分叉/合并模式、推測處理模式、延遲模式和共享狀態模式等。這也包括自定義模式實現。
? 第14章“分布式存儲管理”,探討如何在分布式程序中共享存儲。本章還介紹通信網絡的類型和特征、拓撲結構、消息傳遞接口等。
充分利用本書
要完成本書的學習,需要在系統上安裝Visual Studio 2019和.NET Core 3。建議先掌握一些有關C#語言和操作系統方面的基礎知識。
下載示例代碼文件
讀者可以從www.packtpub.com下載本書的示例代碼文件。具體步驟如下。
(1)登錄或注冊www.packtpub.com。
(2)在Search(搜索)框中輸入本書英文版名稱的一部分Hands-On-Parallel-Programming,即可在推薦下拉菜單中看到本書,如圖P-1所示。

圖P-1
(3)選擇Hands-On Parallel Programming with C# 8 and .NET Core 3一書,在其詳細信息頁面中單擊Download code files(下載代碼文件)超鏈接,如圖P-2所示。

圖P-2
提示:如果未出現Download code files(下載代碼文件)超鏈接,請先注冊并登錄該網站。
下載文件后,請確保使用下列最新版本解壓縮或解壓縮文件夾。
? WinRAR/7-Zip(Windows系統)。
? Zipeg/iZip/UnRarX(Mac系統)。
? 7-Zip/PeaZip(Linux系統)。
另外,本書的代碼包也已經托管在GitHub上,對應網址如下。

https://github.com/PacktPublishing/Hands-On-Parallel-Programming-with-C-8-and-.NET- Core-3

在上述頁面上,單擊Code(代碼)按鈕,然后選擇Download ZIP即可下載本書代碼包,如圖P-3所示。

圖P-3
此外,如果代碼有更新,則會在現有GitHub存儲庫上進行更新。
下載彩色圖像
我們還提供了一個PDF文件,其中包含本書所使用的屏幕截圖/圖表的彩色圖像。可以通過以下地址下載。

https://static.packt-cdn.com/downloads/9781789132410_ColorImages.pdf

本書約定
本書使用了許多文本約定。
(1)CodeInText:表示文本中的代碼字、數據庫表名、文件夾名、文件名、文件擴展名、路徑名、虛擬URL和用戶輸入等。以下段落就是一個示例。
從.NET Framework 4開始,許多線程安全集合被添加到.NET庫中。還添加了一個新的命名空間System.Threading.Concurrent。這包括以下結構。
? IProducerConsumerCollection<T>。
? BlockingCollection<T>。
? ConcurrentDictionary<TKey, TValue>。
(2)有關代碼塊的設置如下:

private static void PrintNumber10Times()
{
for (int i = 0; i < 10; i++)
{
Console.Write(1);
}
Console.WriteLine();
}

(3)任何命令行輸入或輸出都采用如下所示的粗體代碼形式:

private static void PrintNumber10Times()
{
for (int i = 0; i < 10; i++)
{
Console.Write(1);
}
Console.WriteLine();
}

(4)術語或重要單詞采用中英文對照形式,在括號內保留其英文原文。示例如下:

就集合而言,線程安全(Thread Safe)并不是一個全新的概念。所謂線程安全,就是指在擁有共享數據的多條線程并行執行的程序中,代碼會通過同步機制保證各個線程都可以被正確執行,而不會出現數據被污染等意外情況。

(5)對于界面詞匯則保留其英文原文,在后面使用括號添加其中文翻譯。示例如下:

Test Explorer(測試資源管理器)的一項關鍵功能是能夠并行運行測試用例。如果你的系統具有多個CPU核心,則可以輕松利用并行性來更快地運行測試用例。這可以通過單擊Test Explorer(測試資源管理器)中的Run Tests in parallel(并行運行測試)按鈕來完成。
(6)本書還使用了以下兩個圖標。
表示警告或重要的注意事項。
表示提示或小技巧。
關于作者
Shakti Tanwar是Techpro Compsoft Pvt Ltd(一家全球信息技術咨詢提供商)的首席執行官。他是一名技術推廣人員和軟件架構師,在軟件開發和企業培訓方面擁有超過15年的經驗。Shakti是一名Microsoft認證培訓師,并且一直與Microsoft合作在中東地區開展培訓。他的專業領域包括.NET、Azure機器學習、人工智能、純函數式編程的應用和并行計算等。
沒有我的妻子Kirti和兒子Shashwat的支持,這本書是不可能面世的,正是他們的微笑和鼓勵使我奮力前進。
永遠感謝我的父母和兄弟姐妹,他們一直激勵著我邁向新的成功高度。
非常感謝我的朋友、導師和Packt團隊,他們在本書的創作中為我提供了悉心的指導。
關于審稿人
Alvin Ashcraft是一名居住在費城附近的開發人員。他從事C#、Visual Studio、WPF、ASP.NET等軟件的開發工作長達23年。他已經9次獲得Microsoft MVP頭銜。他的博客是Morning Dew,內容大都與.NET開發有關。另外,他也是Allscripts的首席軟件工程師,負責構建醫療保健軟件。他之前曾在軟件公司(包括Oracle)任職。他還審讀過Packt Publishing的其他書稿,如Mastering ASP.NET Core 2.0、Mastering Entity Framework Core 2.0和Learning ASP.NET Core 2.0等。
Vidya Vrat Agarwal是一位飽學之士、演講人、Apress的出版作者,并且也是Apress、Packt和O’Reilly等出版社10多本書的技術審稿人。除此之外,他還是一位架構師,在為大型企業設計架構和開發分布式軟件解決方案方面擁有20年的經驗。在T-Mobile擔任首席架構師時,他曾與B2C和B2B團隊合作,為各種T-Mobile計劃建立解決方案和架構路線圖,從而對數百萬的T-Mobile客戶產生積極影響。他將軟件開發視為一種技巧,并且積極支持軟件架構和簡潔代碼實踐。
內容簡介:

《并行編程實戰:基于C# 8和.NET Core 3》詳細闡述了與并行編程相關的基本解決方案,主要包括并行編程簡介、任務并行性、實現數據并行、使用PLINQ、同步原語、使用并發集合、通過延遲初始化提高性能、異步編程詳解、基于任務的異步編程基礎、使用Visual Studio調試任務、編寫并行和異步代碼的單元測試用例、ASP.NET Core中的IIS和Kestrel、并行編程中的模式、分布式存儲管理等內容。此外,本書還提供了相應的示例、代碼,以幫助讀者進一步理解相關方案的實現過程。
《并行編程實戰:
基于C# 8和.NET Core 3》適合作為高等院校計算機及相關專業的教材和教學參考書,也可作為相關開發人員的自學讀物和參考手冊。
目錄:

第1篇線程、多任務和異步基礎
第1章并行編程簡介 3
1.1技術要求 3
1.2為多核計算做準備 4
1.2.1進程 4
1.2.2硬件和應用程序的性能 4
1.2.3多任務 4
1.2.4超線程 5
1.2.5Flynn分類法 6
1.2.6線程 7
1.2.7線程類型 7
1.2.8線程單元狀態 7
1.2.9多線程 10
1.2.10Thread類 12
1.2.11使用Thread類的優缺點 16
1.2.12ThreadPool類 17
1.2.13使用ThreadPool的優缺點 19
1.2.14BackgroundWorker 20
1.2.15使用BackgroundWorker的優缺點 23
1.2.16多線程與多任務對比 24
1.3適用并行編程技術的場景 24
1.4并行編程的優缺點 25
1.5小結 26
1.6牛刀小試 26
第2章任務并行性 29
2.1技術要求 29
2.2任務 29
2.3創建和啟動任務 30
2.3.1System.Threading.Tasks.Task類 31
2.3.2System.Threading.Tasks.Task.Factory.StartNew方法 32
2.3.3System.Threading.Tasks.Task.Run方法 33
2.3.4System.Threading.Tasks.Task.Delay方法 33
2.3.5System.Threading.Tasks.Task.Yield方法 34
2.3.6System.Threading.Tasks.Task.FromResult<T>方法 36
2.3.7System.Threading.Tasks.Task.FromException和System.Threading.
Tasks.Task.FromException<T>方法 37
2.3.8System.Threading.Tasks.Task.FromCanceled和System.Threading.Tasks.
Task.FromCanceled<T>方法 37
2.4從完成的任務中獲取結果 38
2.5取消任務 39
2.5.1創建令牌 40
2.5.2使用令牌創建任務 40
2.5.3通過IsCancellationRequested屬性輪詢令牌的狀態 41
2.5.4注冊請求取消的回調 42
2.6等待正在運行的任務 44
2.6.1Task.Wait 44
2.6.2Task.WaitAll 45
2.6.3Task.WaitAny 45
2.6.4Task.WhenAll 46
2.6.5Task.WhenAny 46
2.7處理任務異常 47
2.7.1處理來自單個任務的異常 47
2.7.2處理來自多個任務的異常 48
2.7.3使用回調函數處理任務異常 49
2.8將APM模式轉換為任務 50
2.9將EAP模式轉換為任務 52
2.10有關任務的更多信息 54
2.10.1后續任務 54
2.10.2使用Task.ContinueWith方法繼續執行任務 54
2.10.3使用Task.Factory.ContinueWhenAll和Task.Factory.ContinueWhenAll<T>
繼續執行任務 55
2.10.4使用Task.Factory.ContinueWhenAny和Task.Factory.
ContinueWhenAny<T>繼續執行任務 56
2.10.5父任務和子任務 57
2.10.6創建一個分離的子任務 57
2.10.7創建一個附加的任務 58
2.11工作竊取隊列 59
2.12小結 62
2.13牛刀小試 62
第3章實現數據并行 65
3.1技術要求 65
3.2從順序循環到并行循環 65
3.2.1使用Parallel.Invoke方法 66
3.2.2使用Parallel.For方法 68
3.2.3使用Parallel.ForEach方法 69
3.3了解并行度 70
3.4在并行循環中創建自定義分區策略 72
3.4.1范圍分區 73
3.4.2塊分區 73
3.5取消循環 74
3.5.1使用Parallel.Break 75
3.5.2使用ParallelLoopState.Stop 76
3.5.3使用CancellationToken 77
3.6了解并行循環中的線程存儲 79
3.6.1線程局部變量 79
3.6.2分區局部變量 80
3.7小結 81
3.8牛刀小試 81
第4章使用PLINQ 83
4.1技術要求 83
4.2.NET中的LINQ提供程序 84
4.3編寫PLINQ查詢 84
4.3.1關于ParallelEnumerable類 85
4.3.2編寫第一個PLINQ查詢 85
4.4在并行執行時保持順序 86
4.4.1使用AsOrdered()方法 87
4.4.2使用AsUnOrdered()方法 88
4.5PLINQ中的合并選項 88
4.5.1使用NotBuffered合并選項 88
4.5.2使用AutoBuffered合并選項 89
4.5.3使用FullyBuffered合并選項 90
4.6使用PLINQ拋出和處理異常 92
4.7組合并行和順序LINQ查詢 94
4.8取消PLINQ查詢 95
4.9使用PLINQ進行并行編程時要考慮的事項 97
4.10影響PLINQ性能的因素 97
4.10.1并行度 97
4.10.2合并選項 98
4.10.3分區類型 98
4.10.4確定是保持順序執行還是轉向并行 98
4.10.5操作順序 98
4.10.6使用ForAll 99
4.10.7強制并行 99
4.10.8生成序列 99
4.11小結 100
4.12牛刀小試 100
第2篇支持.NETCore中并行性的數據結構
第5章同步原語 105
5.1技術要求 105
5.2關于同步原語 105
5.3互鎖操作 106
5.3.1.NET中的內存屏障 108
5.3.2重新排序 108
5.3.3內存屏障的類型 109
5.3.4避免使用構造對代碼進行重新排序 110
5.4鎖原語 111
5.4.1鎖的工作方式 111
5.4.2線程狀態 111
5.4.3阻塞與自旋 113
5.5鎖、互斥鎖和信號量 113
5.5.1鎖 114
5.5.2互斥鎖 116
5.5.3信號量 118
5.5.4ReaderWriterLock 120
5.6信號原語 120
5.6.1Thread.Join 120
5.6.2EventWaitHandle 122
5.6.3AutoResetEvent 122
5.6.4ManualResetEvent 123
5.6.5WaitHandle 125
5.7輕量級同步原語 129
5.7.1Slim鎖 129
5.7.2ReaderWriterLockSlim 130
5.7.3SemaphoreSlim 131
5.7.4ManualResetEventSlim 132
5.8屏障和倒數事件 133
5.9使用Barrier和CountDownEvent的案例研究 133
5.10SpinWait 136
5.11自旋鎖 136
5.12小結 137
5.13牛刀小試 138
第6章使用并發集合 141
6.1技術要求 141
6.2并發集合詳解 141
6.2.1關于IProducerConsumerCollection<T> 142
6.2.2使用ConcurrentQueue<T> 143
6.2.3使用隊列解決生產者-消費者問題 143
6.2.4使用并發隊列解決問題 145
6.2.5Queue<T>與ConcurrentQueue<T>性能對比 146
6.2.6使用ConcurrentStack<T> 146
6.2.7創建并發堆棧 146
6.2.8使用ConcurrentBag<T> 148
6.2.9使用BlockingCollection<T> 149
6.2.10創建BlockingCollection<T> 150
6.3多生產者-消費者應用場景 151
6.4使用ConcurrentDictionary<TKey,TValue> 153
6.5小結 154
6.6牛刀小試 155
第7章通過延遲初始化提高性能 157
7.1技術要求 157
7.2延遲初始化概念簡析 157
7.3關于System.Lazy<T> 161
7.3.1封裝在構造函數中的構造邏輯 161
7.3.2作為委托傳遞給Lazy<T>的構造邏輯 162
7.4使用延遲初始化模式處理異常 163
7.4.1初始化期間沒有異常發生 164
7.4.2使用異常緩存初始化時出現隨機異常 164
7.4.3不緩存異常 166
7.5線程本地存儲的延遲初始化 167
7.6減少延遲初始化的開銷 169
7.7小結 171
7.8牛刀小試 172
第3篇使用C#進行異步編程
第8章異步編程詳解 175
8.1技術要求 175
8.2程序執行的類型 175
8.2.1理解同步程序執行 176
8.2.2理解異步程序執行 177
8.3適合使用異步編程的情形 178
8.3.1編寫異步代碼 179
8.3.2使用Delegate類的BeginInvoke方法 179
8.3.3使用Task類 181
8.3.4使用IAsyncResult接口 181
8.4不宜使用異步編程的情形 183
8.5使用異步代碼可以解決的問題 183
8.6小結 184
8.7牛刀小試 185
第9章基于任務的異步編程基礎 187
9.1技術要求 187
9.2關于async和await關鍵字 187
9.2.1使用async和await關鍵字的原因 188
9.2.2異步方法的返回類型 191
9.3異步委托和Lambda表達式 192
9.4基于任務的異步模式 192
9.4.1編譯器方法,使用async關鍵字 193
9.4.2手動實現TAP 193
9.5異步代碼的異常處理 194
9.5.1返回Task并拋出異常的方法 194
9.5.2從try-catch塊外部調用異步方法并且不帶await關鍵字 194
9.5.3從try-catch塊內部調用異步方法并且不帶await關鍵字 196
9.5.4從try-catch塊外部使用await關鍵字調用異步方法 198
9.5.5返回void的方法 199
9.6使用PLINQ實現異步 200
9.7衡量異步代碼的性能 201
9.8使用異步代碼的準則 203
9.8.1避免使用異步void 204
9.8.2使用異步連鎖鏈 204
9.8.3盡可能使用ConfigureAwait 205
9.9小結 205
9.10牛刀小試 205
第4篇異步代碼的調試、診斷和單元測試
第10章使用VisualStudio調試任務 209
10.1技術要求 209
10.2使用VisualStudio2019進行調試 209
10.3如何調試線程 210
10.4使用并行堆棧窗口 212
10.4.1使用并行堆棧窗口進行調試 213
10.4.2線程視圖 213
10.4.3任務視圖 215
10.4.4使用并行觀察窗口進行調試 216
10.5使用并發可視化器 217
10.5.1利用率視圖 219
10.5.2線程視圖 219
10.5.3核心視圖 220
10.6小結 220
10.7牛刀小試 221
10.8深入閱讀 222
第11章編寫并行和異步代碼的單元測試用例 223
11.1技術要求 223
11.2使用.NETCore進行單元測試 224
11.3了解編寫異步代碼的單元測試用例的問題 226
11.4編寫并行代碼和異步代碼的單元測試用例 228
11.4.1檢查成功的結果 229
11.4.2檢查除數為0時的異常結果 229
11.5使用Moq模擬異步代碼的設置 230
11.6使用測試工具 232
11.7小結 233
11.8牛刀小試 233
11.9深入閱讀 234
第5篇.NETCore附加的并行編程功能
第12章ASP.NETCore中的IIS和Kestrel 237
12.1技術要求 237
12.2IIS線程模型 237
12.2.1避免饑餓算法 238
12.2.2爬山算法 238
12.3Kestrel線程模型 239
12.3.1ASP.NETCore1.x 241
12.3.2ASP.NETCore2.x 241
12.4微服務中線程的最佳實踐 242
12.4.1單線程單進程微服務 242
12.4.2單線程多進程微服務 243
12.4.3多線程單進程微服務 243
12.4.4異步服務 243
12.4.5專用線程池 243
12.5在ASP.NETMVCCore中使用異步 245
12.5.1創建異步WebAPI 245
12.5.2異步流 248
12.6小結 251
12.7牛刀小試 251
第13章并行編程中的模式 253
13.1技術要求 253
13.2MapReduce模式 253
13.2.1映射和歸約 253
13.2.2使用LINQ實現MapReduce 254
13.3聚合 257
13.4分叉/合并模式 258
13.5推測處理模式 259
13.6延遲模式 260
13.7共享狀態模式 263
13.8小結 263
13.9牛刀小試 264
第14章分布式存儲管理 265
14.1技術要求 265
14.2分布式系統簡介 265
14.3共享存儲模型與分布式存儲模型 267
14.3.1共享存儲模型 267
14.3.2分布式存儲模型 268
14.4通信網絡的類型 270
14.4.1靜態通信網絡 270
14.4.2動態通信網絡 270
14.5通信網絡的特征 271
14.5.1拓撲結構 271
14.5.2路由算法 272
14.5.3交換策略 272
14.5.4流控制 273
14.6拓撲結構探索 273
14.6.1線性和環形拓撲 274
14.6.2網格和環面 275
14.7使用消息傳遞接口對分布式存儲計算機進行編程 277
14.7.1使用MPI的理由 277
14.7.2在Windows系統上安裝MPI 277
14.7.3使用MPI的示例程序 277
14.7.4基本的發送/接收操作 278
14.8集合通信 279
14.9小結 280
14.10牛刀小試 280
附錄牛刀小試答案 283
序: