第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 使用Manual ResetEventS lim类 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