毫不夸张地说,C#可能是这个星球上最与时俱进的语言了。几乎每隔一段时间,微软都会推出新版本的.NET Framework框架。每次版本更迭,C#都会引入一些令人兴奋的新特性,但为了保持向后兼容,它也变得越来越复杂。尤其是C#中的多线程编程方面,有太多的方式和方法可供选择。这可能会导致两种情况,初学者学会一种后就试图匹配任何场景,而有经验的开发人员则往往对某一场景纠结于应该选择哪种多线编程方式。避免该问题的方式就是深入了解C#多线程编程的整个设施架构。而本书正是能帮助你快速建立起C#中多线程编程世界观的书籍。
本书的阅读门槛很低,刚开始讲述了线程基础、线程同步、线程池等基本概念。接下来讲述了C#4.0引入的关于异步操作的任务并行库以及C#6.0中最新的关于异步编程的语法和库。另外也涉猎了并发集合、PLINQ及Reactive Extensions等用于提高异步编程开发效率的实用库。同时也讲述了异步I/O的常用场景和常见的并行编程模式。最后讲述了在Windows 10以及其他操作系统平台上使用异步编程的一些范例。
本书展示了作者娴熟的技术功底。几乎每一小节都附有详细的可运行的代码,并且对代码进行了细致入微的解读。读者可以一边阅读一边实战,一点也不会觉得吃力。
本人在翻译和校审本书过程中得到了同事和家人的帮助和支持,华章公司的编辑也提出了很多宝贵的建议,在此一并表示感谢。最后,希望本书能给大家带来一次超凡的阅读体验。
封面图
目录
- 译者序
- 前言
- 第1章线程基础 1
- 1.1简介 1
- 1.2使用C#创建线程 2
- 1.2.1准备工作 2
- 1.2.2实现方式 2
- 1.2.3工作原理 4
- 1.3暂停线程 4
- 1.3.1准备工作 5
- 1.3.2实现方式 5
- 1.3.3工作原理 5
- 1.4线程等待 6
- 1.4.1准备工作 6
- 1.4.2实现方式 6
- 1.4.3工作原理 7
- 1.5终止线程 7
- 1.5.1准备工作 7
- 1.5.2实现方式 7
- 1.5.3工作原理 8
- 1.6检测线程状态 8
- 1.6.1准备工作 8
- 1.6.2实现方式 8
- 1.6.3工作原理 9
- 1.7线程优先级 10
- 1.7.1准备工作 10
- 1.7.2实现方式 10
- 1.7.3工作原理 12
- 1.8前台线程和后台线程 12
- 1.8.1准备工作 12
- 1.8.2实现方式 12
- 1.8.3工作原理 13
- 1.9向线程传递参数 14
- 1.9.1准备工作 14
- 1.9.2实现方式 14
- 1.9.3工作原理 16
- 1.9.4更多信息 16
- 1.10使用C#中的lock关键字 16
- 1.10.1准备工作 16
- 1.10.2实现方式 16
- 1.10.3工作原理 18
- 1.11使用Monitor类锁定资源 19
- 1.11.1准备工作 19
- 1.11.2实现方式 19
- 1.11.3工作原理 21
- 1.12处理异常 21
- 1.12.1准备工作 21
- 1.12.2实现方式 22
- 1.12.3工作原理 23
- 第2章线程同步 24
- 2.1简介 24
- 2.2执行基本的原子操作 25
- 2.2.1准备工作 25
- 2.2.2实现方式 25
- 2.2.3工作原理 27
- 2.3使用Mutex类 28
- 2.3.1准备工作 28
- 2.3.2实现方式 28
- 2.3.3工作原理 29
- 2.4使用SemaphoreSlim类 29
- 2.4.1准备工作 29
- 2.4.2实现方式 29
- 2.4.3工作原理 30
- 2.4.4更多信息 30
- 2.5使用AutoResetEvent类 31
- 2.5.1准备工作 31
- 2.5.2实现方式 31
- 2.5.3工作原理 32
- 2.6使用ManualResetEventSlim类 32
- 2.6.1准备工作 32
- 2.6.2实现方式 33
- 2.6.3工作原理 34
- 2.6.4更多信息 34
- 2.7使用CountDownEvent类 34
- 2.7.1准备工作 34
- 2.7.2实现方式 34
- 2.7.3工作原理 35
- 2.8使用Barrier类 35
- 2.8.1准备工作 35
- 2.8.2实现方式 36
- 2.8.3工作原理 36
- 2.9使用ReaderWriterLockSlim类 37
- 2.9.1准备工作 37
- 2.9.2实现方式 37
- 2.9.3工作原理 39
- 2.10使用SpinWait类 39
- 2.10.1准备工作 39
- 2.10.2实现方式 39
- 2.10.3工作原理 41
- 第3章使用线程池 42
- 3.1简介 42
- 3.2在线程池中调用委托 43
- 3.2.1准备工作 44
- 3.2.2实现方式 44
- 3.2.3工作原理 45
- 3.3向线程池中放入异步操作 46
- 3.3.1准备工作 46
- 3.3.2实现方式 46
- 3.3.3工作原理 47
- 3.4线程池与并行度 48
- 3.4.1准备工作 48
- 3.4.2实现方式 48
- 3.4.3工作原理 49
- 3.5实现一个取消选项 50
- 3.5.1准备工作 50
- 3.5.2实现方式 50
- 3.5.3工作原理 52
- 3.6在线程池中使用等待事件处理器及超时 52
- 3.6.1准备工作 52
- 3.6.2实现方式 52
- 3.6.3工作原理 54
- 3.6.4更多信息 54
- 3.7使用计时器 54
- 3.7.1准备工作 55
- 3.7.2实现方式 55
- 3.7.3工作原理 56
- 3.8使用BackgroundWorker组件 56
- 3.8.1准备工作 56
- 3.8.2实现方式 56
- 3.8.3工作原理 58
- 第4章使用任务并行库 60
- 4.1简介 60
- 4.2创建任务 61
- 4.2.1准备工作 62
- 4.2.2实现方式 62
- 4.2.3工作原理 63
- 4.3使用任务执行基本的操作 63
- 4.3.1准备工作 64
- 4.3.2实现方式 64
- 4.3.3工作原理 65
- 4.4组合任务 65
- 4.4.1准备工作 65
- 4.4.2实现方式 65
- 4.4.3工作原理 67
- 4.5将APM模式转换为任务 68
- 4.5.1准备工作 68
- 4.5.2实现方式 68
- 4.5.3工作原理 70
- 4.6将EAP模式转换为任务 71
- 4.6.1准备工作 71
- 4.6.2实现方式 71
- 4.6.3工作原理 72
- 4.7实现取消选项 73
- 4.7.1准备工作 73
- 4.7.2实现方式 73
- 4.7.3工作原理 74
- 4.8处理任务中的异常 75
- 4.8.1准备工作 75
- 4.8.2实现方式 75
- 4.8.3工作原理 76
- 4.8.4更多信息 77
- 4.9并行运行任务 77
- 4.9.1准备工作 77
- 4.9.2实现方式 77
- 4.9.3工作原理 78
- 4.10使用TaskScheduler配置任务的执行 79
- 4.10.1准备工作 79
- 4.10.2实现方式 79
- 4.10.3工作原理 81
- 第5章使用C# 6.0 83
- 5.1简介 83
- 5.2使用await操作符获取异步任务结果 85
- 5.2.1准备工作 85
- 5.2.2实现方式 85
- 5.2.3工作原理 87
- 5.3在lambda表达式中使用await操作符 87
- 5.3.1准备工作 87
- 5.3.2实现方式 87
- 5.3.3工作原理 88
- 5.4对连续的异步任务使用await操作符 89
- 5.4.1准备工作 89
- 5.4.2实现方式 89
- 5.4.3工作原理 90
- 5.5对并行执行的异步任务使用await操作符 91
- 5.5.1准备工作 91
- 5.5.2实现方式 91
- 5.5.3工作原理 92
- 5.6处理异步操作中的异常 93
- 5.6.1准备工作 93
- 5.6.2实现方式 93
- 5.6.3工作原理 95
- 5.7避免使用捕获的同步上下文 95
- 5.7.1准备工作 95
- 5.7.2实现方式 96
- 5.7.3工作原理 98
- 5.8使用async void方法 99
- 5.8.1准备工作 99
- 5.8.2实现方式 99
- 5.8.3工作原理 101
- 5.9设计一个自定义的awaitable类型 102
- 5.9.1准备工作 102
- 5.9.2实现方式 102
- 5.9.3工作原理 104
- 5.10对动态类型使用await 105
- 5.10.1准备工作 105
- 5.10.2实现方式 105
- 5.10.3工作原理 107
- 第6章使用并发集合 109
- 6.1简介 109
- 6.2使用ConcurrentDictionary 110
- 6.2.1准备工作 111
- 6.2.2实现方式 111
- 6.2.3工作原理 112
- 6.3使用ConcurrentQueue实现异步处理 113
- 6.3.1准备工作 113
- 6.3.2实现方式 113
- 6.3.3工作原理 115
- 6.4改变ConcurrentStack异步处理顺序 115
- 6.4.1准备工作 115
- 6.4.2实现方式 115
- 6.4.3工作原理 117
- 6.5使用ConcurrentBag创建一个可扩展的爬虫 117
- 6.5.1准备工作 117
- 6.5.2实现方式 118
- 6.5.3工作原理 120
- 6.6使用BlockingCollection进行异步处理 121
- 6.6.1准备工作 121
- 6.6.2实现方式 121
- 6.6.3工作原理 123
- 第7章使用PLINQ 124
- 7.1简介 124
- 7.2使用Parallel类 125
- 7.2.1准备工作 126
- 7.2.2实现方式 126
- 7.2.3工作原理 127
- 7.3并行化LINQ查询 127
- 7.3.1准备工作 128
- 7.3.2实现方式 128
- 7.3.3工作原理 130
- 7.4调整PLINQ查询的参数 131
- 7.4.1准备工作 131
- 7.4.2实现方式 131
- 7.4.3工作原理 132
- 7.5处理PLINQ查询中的异常 133
- 7.5.1准备工作 133
- 7.5.2实现方式 133
- 7.5.3工作原理 135
- 7.6管理PLINQ查询中的数据分区 135
- 7.6.1准备工作 135
- 7.6.2实现方式 135
- 7.6.3工作原理 137
- 7.7为PLINQ查询创建一个自定义的聚合器 138
- 7.7.1准备工作 138
- 7.7.2实现方式 138
- 7.7.3工作原理 140
- 第8章使用Reactive Extensions 142
- 8.1简介 142
- 8.2将普通集合转换为异步的可观察集合 143
- 8.2.1准备工作 143
- 8.2.2实现方式 143
- 8.2.3工作原理 145
- 8.3编写自定义的可观察对象 146
- 8.3.1准备工作 146
- 8.3.2实现方式 146
- 8.3.3工作原理 148
- 8.4使用Subject 148
- 8.4.1准备工作 148
- 8.4.2实现方式 149
- 8.4.3工作原理 151
- 8.5创建可观察的对象 151
- 8.5.1准备工作 152
- 8.5.2实现方式 152
- 8.5.3工作原理 153
- 8.6对可观察的集合使用LINQ查询 154
- 8.6.1准备工作 154
- 8.6.2实现方式 154
- 8.6.3工作原理 155
- 8.7使用Rx创建异步操作 156
- 8.7.1准备工作 156
- 8.7.2实现方式 156
- 8.7.3工作原理 159
- 第9章使用异步I/O 160
- 9.1简介 160
- 9.2异步地使用文件 162
- 9.2.1准备工作 162
- 9.2.2实现方式 162
- 9.2.3工作原理 165
- 9.3编写一个异步的HTTP服务器和客户端 165
- 9.3.1准备工作 165
- 9.3.2实现方式 165
- 9.3.3工作原理 167
- 9.4异步操作数据库 168
- 9.4.1准备工作 168
- 9.4.2实现方式 168
- 9.4.3工作原理 171
- 9.5异步调用WCF服务 171
- 9.5.1准备工作 171
- 9.5.2实现方式 171
- 9.5.3工作原理 174
- 第10章并行编程模式 176
- 10.1简介 176
- 10.2实现惰性求值的共享状态 177
- 10.2.1准备工作 177
- 10.2.2实现方式 177
- 10.2.3工作原理 180
- 10.3使用BlockingCollection实现并行管道 181
- 10.3.1准备工作 181
- 10.3.2实现方式 181
- 10.3.3工作原理 186
- 10.4使用TPL数据流实现并行管道 186
- 10.4.1准备工作 186
- 10.4.2实现方式 187
- 10.4.3工作原理 189
- 10.5使用PLINQ实现Map/Reduce模式 190
- 10.5.1准备工作 190
- 10.5.2实现方式 190
- 10.5.3工作原理 194
- 第11章更多信息 195
- 11.1简介 195
- 11.2在通用Windows平台应用中使用计时器 196
- 11.2.1准备工作 196
- 11.2.2实现方式 197
- 11.2.3工作原理 200
- 11.3在通常的应用程序中使用WinRT 201
- 11.3.1准备工作 201
- 11.3.2实现方式 201
- 11.3.3工作原理 203
- 11.4在通用Windows平台应用中使用BackgroundTask 203
- 11.4.1准备工作 204
- 11.4.2实现方式 204
- 11.4.3工作原理 209
- 11.5在OS X上运行.NET内核应用程序 209
- 11.5.1准备工作 210
- 11.5.2实现方式 210
- 11.5.3工作原理 211
- 11.6在Ubuntu Linux上运行.NET内核应用程序 212
- 11.6.1准备工作 212
- 11.6.2实现方式 212
- 11.6.3工作原理 214