新書推薦:
《
冯友兰和青年谈心系列:看似平淡的坚持
》
售價:NT$
254.0
《
舍不得星星:全2册
》
售價:NT$
356.0
《
汉字理论与汉字阐释概要 《说解汉字一百五十讲》作者李守奎新作
》
售價:NT$
347.0
《
汗青堂丛书144·决战地中海
》
售價:NT$
765.0
《
逝去的武林(十周年纪念版 武学宗师 口述亲历 李仲轩亲历一九三零年代武人言行录)
》
售價:NT$
250.0
《
唐代冠服图志(百余幅手绘插画 图解唐代各类冠服 涵盖帝后 群臣 女官 士庶 军卫等 展现唐代社会风貌)
》
售價:NT$
398.0
《
知宋·宋代之科举
》
售價:NT$
454.0
《
那本书是(吉竹伸介与又吉直树 天才联动!)
》
售價:NT$
454.0
|
編輯推薦: |
《并行编程实战:基于C# 8和.NET Core 3》详细介绍了C#和.NET Core并行编程技巧,阐释了多核计算、多任务、超线程、线程池和并行编程的重要概念以及现代并行编程结构,并通过实例演示了如何实现任务并行性,以有效利用CPU资源和提高程序性能。
本书还介绍了数据并行性、PLINQ支持、支持.NET Core中并行性的数据结构、同步原语、.NET Core中可用的并发集合、延迟初始化等概念,讨论了适合使用异步编程的情形和不宜使用异步编程的情形,以及如何利用.NET Core中的新结构(async和await关键字)来实现异步代码。
|
內容簡介: |
《并行编程实战:基于C# 8和.NET Core 3》详细阐述了与并行编程相关的基本解决方案,主要包括并行编程简介、任务并行性、实现数据并行、使用PLINQ、同步原语、使用并发集合、通过延迟初始化提高性能、异步编程详解、基于任务的异步编程基础、使用Visual Studio调试任务、编写并行和异步代码的单元测试用例、ASP.NET Core中的IIS和Kestrel、并行编程中的模式、分布式存储管理等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。 《并行编程实战: 基于C# 8和.NET Core 3》适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学读物和参考手册。
|
關於作者: |
沙克蒂·坦沃是Techpro Compsoft Pvt Ltd(一家全球信息技术咨询提供商)的首席执行官。他是一名技术推广人员和软件架构师,在软件开发和企业培训方面拥有超过15年的经验。Shakti是一名Microsoft认证培训师,并且一直与Microsoft合作在中东地区开展培训。他的专业领域包括.NET、Azure机器学习、人工智能、纯函数式编程的应用和并行计算等。
|
目錄:
|
第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.5 Flynn分类法 6
1.2.6 线程 7
1.2.7 线程类型 7
1.2.8 线程单元状态 7
1.2.9 多线程 10
1.2.10 Thread类 12
1.2.11 使用Thread类的优缺点 16
1.2.12 ThreadPool类 17
1.2.13 使用ThreadPool的优缺点 19
1.2.14 BackgroundWorker 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.1 System.Threading.Tasks.Task类 31
2.3.2 System.Threading.Tasks.Task.Factory.StartNew方法 32
2.3.3 System.Threading.Tasks.Task.Run方法 33
2.3.4 System.Threading.Tasks.Task.Delay方法 33
2.3.5 System.Threading.Tasks.Task.Yield方法 34
2.3.6 System.Threading.Tasks.Task.FromResult方法 36
2.3.7 System.Threading.Tasks.Task.FromException和System.Threading.
Tasks.Task.FromException方法 37
2.3.8 System.Threading.Tasks.Task.FromCanceled和System.Threading.Tasks.
Task.FromCanceled方法 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.1 Task.Wait 44
2.6.2 Task.WaitAll 45
2.6.3 Task.WaitAny 45
2.6.4 Task.WhenAll 46
2.6.5 Task.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
继续执行任务 55
2.10.4 使用Task.Factory.ContinueWhenAny和Task.Factory.
ContinueWhenAny继续执行任务 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.St0p 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.5 PLINQ中的合并选项 88
4.5.1 使用N0tBuffered合并选项 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篇 支持.NET Core中并行性的数据结构
第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.4 ReaderWriterLock 120
5.6 信号原语 120
5.6.1 Thread.Join 120
5.6.2 EventWaitHandle 122
5.6.3 AutoResetEvent 122
5.6.4 ManualResetEvent 123
5.6.5 WaitHandle 125
5.7 轻量级同步原语 129
5.7.1 Slim锁 129
5.7.2 ReaderWriterLockSlim 130
5.7.3 SemaphoreSlim 131
5.7.4 ManualResetEventSlim 132
5.8 屏障和倒数事件 133
5.9 使用Barrier和CountDownEvent的案例研究 133
5.10 SpinWait 136
5.11 自旋锁 136
5.12 小结 137
5.13 牛刀小试 138
第6章 使用并发集合 141
6.1 技术要求 141
6.2 并发集合详解 141
6.2.1 关于IProducerConsumerCollection 142
6.2.2 使用ConcurrentQueue 143
6.2.3 使用队列解决生产者-消费者问题 143
6.2.4 使用并发队列解决问题 145
6.2.5 Queue与ConcurrentQueue性能对比 146
6.2.6 使用ConcurrentStack 146
6.2.7 创建并发堆栈 146
6.2.8 使用ConcurrentBag 148
6.2.9 使用BlockingCollection 149
6.2.10 创建BlockingCollection 150
6.3 多生产者-消费者应用场景 151
6.4 使用ConcurrentDictionary 153
6.5 小结 154
6.6 牛刀小试 155
第7章 通过延迟初始化提高性能 157
7.1 技术要求 157
7.2 延迟初始化概念简析 157
7.3 关于System.Lazy 161
7.3.1 封装在构造函数中的构造逻辑 161
7.3.2 作为委托传递给Lazy的构造逻辑 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章 使用Visual Studio调试任务 209
10.1 技术要求 209
10.2 使用Visual Studio 2019进行调试 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 使用.NET Core进行单元测试 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篇 .NET Core附加的并行编程功能
第12章 ASP.NET Core中的IIS和Kestrel 237
12.1 技术要求 237
12.2 IIS线程模型 237
12.2.1 避免饥饿算法 238
12.2.2 爬山算法 238
12.3 Kestrel线程模型 239
12.3.1 ASP.NET Core 1.x 241
12.3.2 ASP.NET Core 2.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.NET MVC Core中使用异步 245
12.5.1 创建异步Web API 245
12.5.2 异步流 248
12.6 小结 251
12.7 牛刀小试 251
第13章 并行编程中的模式 253
13.1 技术要求 253
13.2 MapReduce模式 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 静态通信网络
……
附录
|
內容試閱:
|
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。
? BlockingCollection。
? ConcurrentDictionary。
(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客户产生积极影响。他将软件开发视为一种技巧,并且积极支持软件架构和简洁代码实践。
|
|