內容簡介
本書針對clr和.net framework 4.0進行深入、全面的探討,並結合實例介紹了如何利用它們進行設計、開發和調試。全書5部分29章。第Ⅰ部分介紹clr基礎,第Ⅱ部分解釋如何設計類型,第Ⅲ部分介紹基本類型,第Ⅳ部分以實用特性為主題,第Ⅴ部分花大量篇幅重點介紹執行緒處理。
通過本書的閱讀,讀者可以掌握clr和.net framework的精髓,輕鬆、高效地創建高性能應用程式。
作者簡介
Jeffrey Richter是一位在全球享有盛譽的技術作家,尤其在Windows/.NET領域有著傑出的貢獻。他的第一本Windows著作Windows 3: A Developer's Guide大獲好評,從而聲名遠揚。之洪境妹後,他又推出了經典著作《Windows 高級編程指南》和《Windows核心編程》。如今這兩本書早已成為Windows程式設計領域的顛峰之作,培育了幾代軟體開發設計人員。他的每一本新作問世,我們都有理由仔槳懂相信這是一本巨著,我們想要的一切盡在其中。Jeffery 是Wintellect公司的創始人之一,也是MSDN雜誌.NET專欄的特邀編輯。
目錄
第I部分CLR基礎
第1章CLR的執行模型 3
1.1將原始碼編譯成託管模組 3
1.2將託管模組合併成程式集 6
1.3載入公共語言運行時 8
1.4執行程式集的代碼 10
1.4.1IL和驗證 15
1.4.2不安全的代碼 16
1.5本地代碼生成器:NGen.exe 18
1.6Framework類庫 20
1.7通用類型系統 22
1.8公共語言規範 24
1.9與非託管代碼的互操作性 28
第2章生成、打包、戒判籃部署和管理套用
程式及類型 29
2.1.NETFramework部署目標 29
2.2將類型生成到模組中 31
回響檔案 32
2.3元數據概述 34
2.4將模組合併成程式集 39
2.4.1使用VisualStudioIDE將
程式集添加到項目中全催 45
2.4.2使用程式集連結器 46
2.4.3為程式集添加資源檔案 48
2.5程式集版本資源信息 49
2.6語言文化 53
2.7簡單應用程式部署(私有部署的
程式集) 54
2.8簡單管理控制(配置) 55
第3章共享程式集和強命名程式集 59
3.1兩種程式集,兩種部署 60
3.2為程式集分配強名稱 61
3.4在生成的程再檔巴良序集中引用一個強命名
程式集 67
3.5強命名程式集能防範篡改 69
3.6延遲簽名 70
3.7私有部署強命名程式集 72
3.8“運行時”如何解析類型引用 73
3.9高級管理控制(配置) 76
發布者策略控制 78
第II部分設計類型
第4章類型基礎 83
4.1所有類型都從System.Object派生 83
4.2類型轉換 85
4.3命名空間和程式集 89
4.4運行鴉碑探時的相互聯繫 92
第5章基元類型、引用類型和值類型 101
5.1程式語言的基元類型 101
5.2引用類型和值類型 108
5.3值類型的裝箱和拆箱 113
5.3.1使用接口更改已裝箱值類型
中的欄位(以及為什麼不應該
這樣做) 124
5.3.2對象相等性和同一性 127
5.4對象哈希碼 129
5.5dynamic基元類型 131
第6章類型和成員基礎 137
6.1類型的各種成員 137
6.2類型的可見性 140
友元程式集 140
6.3成員的可訪問性 142
6.4靜態類 143
6.5分部類、結構和接口 145
6.6組件、多態和版本控制 146
6.6.1CLR如何調用虛方法、屬性
和事件 148
6.6.2合理使用類型的可見性和
成員的可訪問性整盼抹盼 151
6.6.3對類型進行版本控制時的
虛方法的處理 154
第7章常量和欄位 159
7.1常量 159
7.2欄位 160
第8章方法 165
8.1實例構造器和類(引用類型) 165
8.2實例構造器和結構(值類型) 168
8.3類型構造器 171
8.5轉換操作符方法 179
8.6擴展方法 182
8.6.1規則和原則 184
8.6.2用擴展方法擴展各種類型 185
8.6.3ExtensionAttribute類 187
8.7分部方法 188
第9章參數 191
9.1可選參數和命名參數 191
9.1.1規則和原則 192
9.1.2DefaultParameterValueAttribute
和OptionalAttribute 194
9.2隱式類型的局部變數 194
9.3以傳引用的方式向方法傳遞參數 196
9.4向方法傳遞可變數量的參數 201
9.5參數和返回類型的指導原則 203
9.6常量性 205
第10章屬性 207
10.1無參屬性 207
10.1.1自動實現的屬性 210
10.1.2合理定義屬性 211
10.1.3對象和集合初始化器 214
10.1.4匿名類型 215
10.1.5System.Tuple類型 218
10.2有參屬性 220
10.3調用屬性訪問器方法時的性能 225
10.4屬性訪問器的可訪問性 225
10.5泛型屬性訪問器方法 225
第11章事件 227
11.1設計要公開事件的類型 228
11.1.1第一步:定義類型來容納所有
需要傳送給事件通知接收者
的附加信息 229
11.1.2第二步:定義事件成員 229
11.1.3第三步:定義負責引發事件
的方法來通知事件的登記
對象 231
11.1.4第四步:定義方法將輸入
轉化為期望事件 233
11.2編譯器如何實現事件 233
11.3設計偵聽事件的類型 235
11.4顯式實現事件 237
第12章泛型 241
12.1Framework類庫中的泛型 245
12.2Wintellect的PowerCollections庫 246
12.3泛型基礎結構 247
12.3.1開放類型和封閉類型 247
12.3.2泛型類型和繼承 249
12.3.3泛型類型同一性 251
12.3.4代碼爆炸 252
12.4泛型接口 252
12.5泛型委託 253
12.6委託和接口的逆變和協變泛型
類型實參 254
12.7泛型方法 256
12.8泛型和其他成員 258
12.9可驗證性和約束 259
12.9.1主要約束 261
12.9.2次要約束 262
12.9.3構造器約束 263
12.9.4其他可驗證性問題 264
第Ⅲ部分基本類型
第13章接口 267
13.1類和接口繼承 267
13.2定義接口 268
13.3繼承接口 269
13.4關於調用接口方法的更多探討 271
13.5隱式和顯式接口方法實現(幕後
發生的事情) 272
13.6泛型接口 274
13.7泛型和接口約束 276
13.8實現多個具有相同方法名和簽名
的接口 277
13.9用顯式接口方法實現來增強編譯時
類型安全性 278
13.10謹慎使用顯式接口方法實現 280
13.11設計:基類還是接口 282
第14章字元、字元串和文本處理 287
14.1字元 287
14.2System.String類型 290
14.2.1構造字元串 290
14.2.2字元串是不可變的 292
14.2.3比較字元串 293
14.2.4字元串留用 298
14.2.5字元串池 301
14.2.6檢查字元串中的字元和文本
元素 301
14.2.7其他字元串操作 303
14.3高效率構造字元串 304
14.3.1構造StringBuilder對象 304
14.3.2StringBuilder的成員 305
14.4獲取對象的字元串表示:ToString 307
14.4.1指定具體的格式和語言
文化 308
14.4.2將多個對象格式成一個字元串 311
14.4.3提供定製格式化器 313
14.5解析字元串來獲取對象:Parse 315
14.6編碼:字元和位元組的相互轉換 317
14.6.1字元和位元組流的編碼和解碼 322
14.6.2Base-64字元串編碼和解碼 323
14.7安全字元串 324
第15章枚舉類型和位標誌 327
15.1枚舉類型 327
15.2位標誌 332
15.3向枚舉類型添加方法 335
第16章數組 337
16.1初始化數組元素 339
16.2數組轉型 341
16.3所有數組都隱式派生自
System.Array 343
16.4所有數組都隱式實現IEnumerable,
Icollection和IList 344
16.5數組的傳遞和返回 345
16.6創建下限非零的數組 346
16.7數組的訪問性能 347
16.8不安全的數組訪問和固定大小的數組 351
第17章委託 353
17.1初識委託 353
17.2用委託回調靜態方法 355
17.3用委託回調實例方法 357
17.4委託揭秘 357
17.5用委託回調許多方法(委託鏈) 361
17.5.1C#對委託鏈的支持 365
17.5.2取得對委託鏈調用的更多控制 365
17.6委託定義太多(泛型委託) 368
17.7C#為委託提供的簡化語法 369
17.7.1簡化語法1:不需要構造委託對象 369
17.7.2簡化語法2:不需要定義回調方法 370
17.7.3簡化語法3:局部變數不需要
手動包裝到類中即可傳給回調方法 373
17.8委託和反射 375
第18章定製attribute 379
18.1使用定製attribute 379
18.2定義自己的attribute類 382
18.3attribute的構造器和欄位/屬性的數據類型 386
18.4檢測定製attribute 387
18.5兩個attribute實例的相互匹配 391
18.6檢測定製attribute時不創建從
Attribute派生的對象 393
18.7條件attribute類 396
第19章可空值類型 399
19.1C#對可空值類型的支持 401
19.2C#的空接合操作符 403
19.3CLR對可空值類型的特殊支持 404
19.3.1可空值類型的裝箱 404
19.3.2可空值類型的拆箱 405
19.3.3通過可空值類型調用GetType 405
19.3.4通過可空值類型調用接口方法 405
第Ⅳ部分核心機制
第20章異常和狀態管理 409
20.1定義“異常” 409
20.2異常處理機制 411
20.2.1try塊 412
20.2.2catch塊 412
20.2.3finally塊 414
20.3System.Exception類 417
20.4FCL定義的異常類 420
20.5拋出異常 422
20.6定義自己的異常類 423
20.7用可靠性換取開發效率 425
20.8指導原則和最佳實踐 433
20.8.1善用finally塊 433
20.8.2不要什麼都捕捉 435
20.8.3得體地從異常中恢復 436
20.8.4發生不可恢復的異常時回滾部分完成的操作——維持狀態 436
20.8.5隱藏實現細節來維繫契約 437
20.9未處理的異常 440
20.10對異常進行調試 444
20.11異常處理的性能問題 446
20.12約束執行區域(CER) 448
20.13代碼契約 451
第21章自動記憶體管理(垃圾回收) 459
21.1理解垃圾回收平台的基本工作
原理 459
21.2垃圾回收算法 463
21.3垃圾回收與調試 466
21.4使用終結操作來釋放本地資源 469
21.4.1使用CriticalFinalizerObject
類型確保終結 470
21.4.2SafeHandle類型及其派生
類型 471
21.4.3使用SafeHandle類型與
21.5對託管資源使用終結操作 475
21.6什麼會導致Finalize方法被調用 477
21.7終結操作揭秘 478
21.8Dispose模式:強制對象清理
資源 481
21.9使用實現了Dispose模式的類型 485
21.10C#的using語句 488
21.11一個有趣的依賴性問題 490
21.12手動監視和控制對象的生存期 491
21.13對象復活 501
21.14代 503
21.15用於本地資源的其他垃圾回收
功能 508
21.16預測需求大量記憶體的操作能否
成功 512
21.17編程控制垃圾回收器 513
21.18執行緒劫持 516
21.19垃圾回收模式 517
21.20大對象 520
21.21監視垃圾回收 520
第22章CLR寄宿和AppDomain 523
22.1CLR寄宿 523
22.2AppDomain 526
22.3卸載AppDomain 538
22.4監視AppDomain 540
22.5AppDomainFirstChance異常通知 541
22.6宿主如何使用AppDomain 541
22.6.1可執行應用程式 542
22.6.2MicrosoftSilverlight富
Internet應用程式 542
22.6.3MicrosoftASP.NET
Web窗體22.6.4MicrosoftSQLServer 543
22.6.5更多的用法只局限於你自己的想像力 543
22.7高級宿主控制 544
22.7.1使用託管代碼管理CLR 544
22.7.2編寫健壯的宿主應用程式 544
22.7.3宿主如何拿回它的執行緒 546
第23章程式集載入和反射 549
23.1程式集載入 549
23.2使用反射構建動態可擴展應用程式 554
23.3反射的性能 555
23.3.1發現程式集中定義的類型 556
23.3.2類型對象的準確含義 556
23.3.3構建Exception派生類型的
一個層次結構 558
23.3.4構造類型的實例 560
23.4設計支持載入項的應用程式 562
23.5使用反射發現類型的成員 564
23.5.1發現類型成員 565
23.5.2BindingFlags:篩選返回的
成員種類 569
23.5.3發現類型的接口 570
23.5.4調用類型的成員 571
23.5.5一次綁定,多次調用 575
23.5.6使用綁定句柄來減少進程的記憶體耗用 581
第24章運行時序列化 585
24.1序列化/反序列化快速入門 586
24.2使類型可序列化 590
24.3控制序列化和反序列化 592
24.4格式化器如何序列化類型實例 595
24.5控制序列化/反序列化的數據 597
24.6流上下文 603
24.7將類型序列化為不同的類型以及將對象反序列化為不同的對象 604
24.8序列化代理 606
代理選擇器鏈 609
24.9反序列化對象時重寫程式集和/或類型 610
第Ⅴ部分執行緒處理
第25章執行緒基礎 615
25.1Windows為什麼要支持執行緒 615
25.2執行緒開銷 616
25.3停止瘋狂 620
25.4CPU發展趨勢 622
25.5NUMA架構的機器 623
25.6CLR執行緒和Windows執行緒 625
25.7使用專用執行緒執行異步的計算限制操作 625
25.8使用執行緒的理由 627
25.9執行緒調度和優先權 629
25.10前台執行緒和後台執行緒 634
25.11繼續學習 635
第26章計算限制的異步操作 637
26.1CLR執行緒池基礎 638
26.2執行簡單的計算限制操作 639
26.3執行上下文 640
26.4協作式取消 642
26.5任務 645
26.5.1等待任務完成並獲取它的
結果 646
26.5.2取消任務 648
26.5.3一個任務完成時自動啟動
一個新任務 649
26.5.4任務可以啟動子任務 651
26.5.5任務內部揭秘 652
26.5.6任務工廠 653
26.5.7任務調度器 655
26.6Parallel的靜態For,ForEach和
Invoke方法 657
26.7並行語言集成查詢(PLINQ) 660
26.8執行定時計算限制操作 663
26.9執行緒池如何管理執行緒 665
26.9.1設定執行緒池限制 665
26.9.2如何管理工作者執行緒 666
26.10快取線和偽共享 667
第27章I/O限制的異步操作 671
27.2CLR的異步編程模型(APM) 675
27.3AsyncEnumerator類 679
27.4APM和異常 682
27.5應用程式及其執行緒處理模型 683
27.6異步實現伺服器 687
27.7APM和計算限制的操作 687
27.8APM的注意事項 689
27.8.1在沒有執行緒池的前提下
使用APM 689
27.8.2總是調用EndXxx方法,而且
只調用一次 690
27.8.3調用EndXxx方法時總是
使用相同的對象 690
27.8.4為BeginXxx和EndXxx方法
使用ref,out和params
實參 691
27.8.5不能取消異步I/O限制
操作 691
27.8.6記憶體消耗 691
完成 691
27.8.8FileStream特有的問題 692
27.9I/O請求優先權 693
27.10將IAsyncResultAPM轉換
為Task 695
27.11基於事件的異步模式 696
27.11.1將EAP轉換為Task 698
27.11.2APM和EAP的對比 699
27.12編程模型的泥沼 700
第28章基元執行緒同步構造 703
28.1類庫和執行緒安全 705
28.2基元用戶模式和核心模式構造 706
28.3用戶模式構造 707
28.3.1易失構造 708
28.3.2互鎖構造 713
28.3.3實現簡單的SpinLock 717
28.3.4InterlockedAnything模式 720
28.4核心模式構造 722
28.4.1Event構造 725
28.4.2Semaphore構造 727
28.4.3Mutex構造 728
28.4.4在一個核心構造可用時調用
一個方法 730
第29章混合執行緒同步構造 733
29.1一個簡單的混合鎖 733
29.2自旋、執行緒所有權和遞歸 735
29.3混合構造的大雜燴 737
29.3.1ManualResetEventSlim類
和SemaphoreSlim類 737
29.3.2Monitor類和同步塊 738
29.3.3ReaderWriterLockSlim類 743
29.3.4OneManyLock類 745
29.3.5CountdownEvent類 747
29.3.6Barrier類 747
29.3.7執行緒同步構造小結 748
29.4著名的雙檢鎖技術 750
29.5條件變數模式 754
29.6用集合防止占有鎖太長的時間 756
29.7並發集合類 760
第30章 混合執行緒同步構造
譯者後記
第4章類型基礎 83
4.1所有類型都從System.Object派生 83
4.2類型轉換 85
4.3命名空間和程式集 89
4.4運行時的相互聯繫 92
第5章基元類型、引用類型和值類型 101
5.1程式語言的基元類型 101
5.2引用類型和值類型 108
5.3值類型的裝箱和拆箱 113
5.3.1使用接口更改已裝箱值類型
中的欄位(以及為什麼不應該
這樣做) 124
5.3.2對象相等性和同一性 127
5.4對象哈希碼 129
5.5dynamic基元類型 131
第6章類型和成員基礎 137
6.1類型的各種成員 137
6.2類型的可見性 140
友元程式集 140
6.3成員的可訪問性 142
6.4靜態類 143
6.5分部類、結構和接口 145
6.6組件、多態和版本控制 146
6.6.1CLR如何調用虛方法、屬性
和事件 148
6.6.2合理使用類型的可見性和
成員的可訪問性 151
6.6.3對類型進行版本控制時的
虛方法的處理 154
第7章常量和欄位 159
7.1常量 159
7.2欄位 160
第8章方法 165
8.1實例構造器和類(引用類型) 165
8.2實例構造器和結構(值類型) 168
8.3類型構造器 171
8.5轉換操作符方法 179
8.6擴展方法 182
8.6.1規則和原則 184
8.6.2用擴展方法擴展各種類型 185
8.6.3ExtensionAttribute類 187
8.7分部方法 188
第9章參數 191
9.1可選參數和命名參數 191
9.1.1規則和原則 192
9.1.2DefaultParameterValueAttribute
和OptionalAttribute 194
9.2隱式類型的局部變數 194
9.3以傳引用的方式向方法傳遞參數 196
9.4向方法傳遞可變數量的參數 201
9.5參數和返回類型的指導原則 203
9.6常量性 205
第10章屬性 207
10.1無參屬性 207
10.1.1自動實現的屬性 210
10.1.2合理定義屬性 211
10.1.3對象和集合初始化器 214
10.1.4匿名類型 215
10.1.5System.Tuple類型 218
10.2有參屬性 220
10.3調用屬性訪問器方法時的性能 225
10.4屬性訪問器的可訪問性 225
10.5泛型屬性訪問器方法 225
第11章事件 227
11.1設計要公開事件的類型 228
11.1.1第一步:定義類型來容納所有
需要傳送給事件通知接收者
的附加信息 229
11.1.2第二步:定義事件成員 229
11.1.3第三步:定義負責引發事件
的方法來通知事件的登記
對象 231
11.1.4第四步:定義方法將輸入
轉化為期望事件 233
11.2編譯器如何實現事件 233
11.3設計偵聽事件的類型 235
11.4顯式實現事件 237
第12章泛型 241
12.1Framework類庫中的泛型 245
12.2Wintellect的PowerCollections庫 246
12.3泛型基礎結構 247
12.3.1開放類型和封閉類型 247
12.3.2泛型類型和繼承 249
12.3.3泛型類型同一性 251
12.3.4代碼爆炸 252
12.4泛型接口 252
12.5泛型委託 253
12.6委託和接口的逆變和協變泛型
類型實參 254
12.7泛型方法 256
12.8泛型和其他成員 258
12.9可驗證性和約束 259
12.9.1主要約束 261
12.9.2次要約束 262
12.9.3構造器約束 263
12.9.4其他可驗證性問題 264
第Ⅲ部分基本類型
第13章接口 267
13.1類和接口繼承 267
13.2定義接口 268
13.3繼承接口 269
13.4關於調用接口方法的更多探討 271
13.5隱式和顯式接口方法實現(幕後
發生的事情) 272
13.6泛型接口 274
13.7泛型和接口約束 276
13.8實現多個具有相同方法名和簽名
的接口 277
13.9用顯式接口方法實現來增強編譯時
類型安全性 278
13.10謹慎使用顯式接口方法實現 280
13.11設計:基類還是接口 282
第14章字元、字元串和文本處理 287
14.1字元 287
14.2System.String類型 290
14.2.1構造字元串 290
14.2.2字元串是不可變的 292
14.2.3比較字元串 293
14.2.4字元串留用 298
14.2.5字元串池 301
14.2.6檢查字元串中的字元和文本
元素 301
14.2.7其他字元串操作 303
14.3高效率構造字元串 304
14.3.1構造StringBuilder對象 304
14.3.2StringBuilder的成員 305
14.4獲取對象的字元串表示:ToString 307
14.4.1指定具體的格式和語言
文化 308
14.4.2將多個對象格式成一個字元串 311
14.4.3提供定製格式化器 313
14.5解析字元串來獲取對象:Parse 315
14.6編碼:字元和位元組的相互轉換 317
14.6.1字元和位元組流的編碼和解碼 322
14.6.2Base-64字元串編碼和解碼 323
14.7安全字元串 324
第15章枚舉類型和位標誌 327
15.1枚舉類型 327
15.2位標誌 332
15.3向枚舉類型添加方法 335
第16章數組 337
16.1初始化數組元素 339
16.2數組轉型 341
16.3所有數組都隱式派生自
System.Array 343
16.4所有數組都隱式實現IEnumerable,
Icollection和IList 344
16.5數組的傳遞和返回 345
16.6創建下限非零的數組 346
16.7數組的訪問性能 347
16.8不安全的數組訪問和固定大小的數組 351
第17章委託 353
17.1初識委託 353
17.2用委託回調靜態方法 355
17.3用委託回調實例方法 357
17.4委託揭秘 357
17.5用委託回調許多方法(委託鏈) 361
17.5.1C#對委託鏈的支持 365
17.5.2取得對委託鏈調用的更多控制 365
17.6委託定義太多(泛型委託) 368
17.7C#為委託提供的簡化語法 369
17.7.1簡化語法1:不需要構造委託對象 369
17.7.2簡化語法2:不需要定義回調方法 370
17.7.3簡化語法3:局部變數不需要
手動包裝到類中即可傳給回調方法 373
17.8委託和反射 375
第18章定製attribute 379
18.1使用定製attribute 379
18.2定義自己的attribute類 382
18.3attribute的構造器和欄位/屬性的數據類型 386
18.4檢測定製attribute 387
18.5兩個attribute實例的相互匹配 391
18.6檢測定製attribute時不創建從
Attribute派生的對象 393
18.7條件attribute類 396
第19章可空值類型 399
19.1C#對可空值類型的支持 401
19.2C#的空接合操作符 403
19.3CLR對可空值類型的特殊支持 404
19.3.1可空值類型的裝箱 404
19.3.2可空值類型的拆箱 405
19.3.3通過可空值類型調用GetType 405
19.3.4通過可空值類型調用接口方法 405
第Ⅳ部分核心機制
第20章異常和狀態管理 409
20.1定義“異常” 409
20.2異常處理機制 411
20.2.1try塊 412
20.2.2catch塊 412
20.2.3finally塊 414
20.3System.Exception類 417
20.4FCL定義的異常類 420
20.5拋出異常 422
20.6定義自己的異常類 423
20.7用可靠性換取開發效率 425
20.8指導原則和最佳實踐 433
20.8.1善用finally塊 433
20.8.2不要什麼都捕捉 435
20.8.3得體地從異常中恢復 436
20.8.4發生不可恢復的異常時回滾部分完成的操作——維持狀態 436
20.8.5隱藏實現細節來維繫契約 437
20.9未處理的異常 440
20.10對異常進行調試 444
20.11異常處理的性能問題 446
20.12約束執行區域(CER) 448
20.13代碼契約 451
第21章自動記憶體管理(垃圾回收) 459
21.1理解垃圾回收平台的基本工作
原理 459
21.2垃圾回收算法 463
21.3垃圾回收與調試 466
21.4使用終結操作來釋放本地資源 469
21.4.1使用CriticalFinalizerObject
類型確保終結 470
21.4.2SafeHandle類型及其派生
類型 471
21.4.3使用SafeHandle類型與
21.5對託管資源使用終結操作 475
21.6什麼會導致Finalize方法被調用 477
21.7終結操作揭秘 478
21.8Dispose模式:強制對象清理
資源 481
21.9使用實現了Dispose模式的類型 485
21.10C#的using語句 488
21.11一個有趣的依賴性問題 490
21.12手動監視和控制對象的生存期 491
21.13對象復活 501
21.14代 503
21.15用於本地資源的其他垃圾回收
功能 508
21.16預測需求大量記憶體的操作能否
成功 512
21.17編程控制垃圾回收器 513
21.18執行緒劫持 516
21.19垃圾回收模式 517
21.20大對象 520
21.21監視垃圾回收 520
第22章CLR寄宿和AppDomain 523
22.1CLR寄宿 523
22.2AppDomain 526
22.3卸載AppDomain 538
22.4監視AppDomain 540
22.5AppDomainFirstChance異常通知 541
22.6宿主如何使用AppDomain 541
22.6.1可執行應用程式 542
22.6.2MicrosoftSilverlight富
Internet應用程式 542
22.6.3MicrosoftASP.NET
Web窗體22.6.4MicrosoftSQLServer 543
22.6.5更多的用法只局限於你自己的想像力 543
22.7高級宿主控制 544
22.7.1使用託管代碼管理CLR 544
22.7.2編寫健壯的宿主應用程式 544
22.7.3宿主如何拿回它的執行緒 546
第23章程式集載入和反射 549
23.1程式集載入 549
23.2使用反射構建動態可擴展應用程式 554
23.3反射的性能 555
23.3.1發現程式集中定義的類型 556
23.3.2類型對象的準確含義 556
23.3.3構建Exception派生類型的
一個層次結構 558
23.3.4構造類型的實例 560
23.4設計支持載入項的應用程式 562
23.5使用反射發現類型的成員 564
23.5.1發現類型成員 565
23.5.2BindingFlags:篩選返回的
成員種類 569
23.5.3發現類型的接口 570
23.5.4調用類型的成員 571
23.5.5一次綁定,多次調用 575
23.5.6使用綁定句柄來減少進程的記憶體耗用 581
第24章運行時序列化 585
24.1序列化/反序列化快速入門 586
24.2使類型可序列化 590
24.3控制序列化和反序列化 592
24.4格式化器如何序列化類型實例 595
24.5控制序列化/反序列化的數據 597
24.6流上下文 603
24.7將類型序列化為不同的類型以及將對象反序列化為不同的對象 604
24.8序列化代理 606
代理選擇器鏈 609
24.9反序列化對象時重寫程式集和/或類型 610
第Ⅴ部分執行緒處理
第25章執行緒基礎 615
25.1Windows為什麼要支持執行緒 615
25.2執行緒開銷 616
25.3停止瘋狂 620
25.4CPU發展趨勢 622
25.5NUMA架構的機器 623
25.6CLR執行緒和Windows執行緒 625
25.7使用專用執行緒執行異步的計算限制操作 625
25.8使用執行緒的理由 627
25.9執行緒調度和優先權 629
25.10前台執行緒和後台執行緒 634
25.11繼續學習 635
第26章計算限制的異步操作 637
26.1CLR執行緒池基礎 638
26.2執行簡單的計算限制操作 639
26.3執行上下文 640
26.4協作式取消 642
26.5任務 645
26.5.1等待任務完成並獲取它的
結果 646
26.5.2取消任務 648
26.5.3一個任務完成時自動啟動
一個新任務 649
26.5.4任務可以啟動子任務 651
26.5.5任務內部揭秘 652
26.5.6任務工廠 653
26.5.7任務調度器 655
26.6Parallel的靜態For,ForEach和
Invoke方法 657
26.7並行語言集成查詢(PLINQ) 660
26.8執行定時計算限制操作 663
26.9執行緒池如何管理執行緒 665
26.9.1設定執行緒池限制 665
26.9.2如何管理工作者執行緒 666
26.10快取線和偽共享 667
第27章I/O限制的異步操作 671
27.2CLR的異步編程模型(APM) 675
27.3AsyncEnumerator類 679
27.4APM和異常 682
27.5應用程式及其執行緒處理模型 683
27.6異步實現伺服器 687
27.7APM和計算限制的操作 687
27.8APM的注意事項 689
27.8.1在沒有執行緒池的前提下
使用APM 689
27.8.2總是調用EndXxx方法,而且
只調用一次 690
27.8.3調用EndXxx方法時總是
使用相同的對象 690
27.8.4為BeginXxx和EndXxx方法
使用ref,out和params
實參 691
27.8.5不能取消異步I/O限制
操作 691
27.8.6記憶體消耗 691
完成 691
27.8.8FileStream特有的問題 692
27.9I/O請求優先權 693
27.10將IAsyncResultAPM轉換
為Task 695
27.11基於事件的異步模式 696
27.11.1將EAP轉換為Task 698
27.11.2APM和EAP的對比 699
27.12編程模型的泥沼 700
第28章基元執行緒同步構造 703
28.1類庫和執行緒安全 705
28.2基元用戶模式和核心模式構造 706
28.3用戶模式構造 707
28.3.1易失構造 708
28.3.2互鎖構造 713
28.3.3實現簡單的SpinLock 717
28.3.4InterlockedAnything模式 720
28.4核心模式構造 722
28.4.1Event構造 725
28.4.2Semaphore構造 727
28.4.3Mutex構造 728
28.4.4在一個核心構造可用時調用
一個方法 730
第29章混合執行緒同步構造 733
29.1一個簡單的混合鎖 733
29.2自旋、執行緒所有權和遞歸 735
29.3混合構造的大雜燴 737
29.3.1ManualResetEventSlim類
和SemaphoreSlim類 737
29.3.2Monitor類和同步塊 738
29.3.3ReaderWriterLockSlim類 743
29.3.4OneManyLock類 745
29.3.5CountdownEvent類 747
29.3.6Barrier類 747
29.3.7執行緒同步構造小結 748
29.4著名的雙檢鎖技術 750
29.5條件變數模式 754
29.6用集合防止占有鎖太長的時間 756
29.7並發集合類 760
第30章 混合執行緒同步構造
譯者後記