概述
在第一章我們描述了什么是線程。我們講述了很多人可能已經很熟悉的背景知識。知道了線程的哪部分最重要。在這一章,你將看到如何實現一些基本的線程;然而了解何時使用線程相對知道基本實現來說更重要一些。
在這章的最后,你將了解:
1. System.Threading 命名空間。
2. 使用線程時有什么設計問題?
3. 線程使用什么資源?
4. 使用線程時要避免什么錯誤?
System.Threading 命名空間
我們已經說過托管代碼中的線程由一個System.Threading線程類實例。在這部分,我們將進一步討論System.Threading命名空間和它的內容。
System.Threading命名空間的類在下表中列出。
類 |
描述 |
AutoResetEvent |
這個事件通知一個或者多個正在等待的線程事件已經發生。 |
Interlocked |
這個類通過為由多個線程共享的變量提供原子操作來避免發生錯誤。 |
ManualResetEvent |
當通知一個或者多個等待的線程已經發生一個事件時發生。 |
Monitor |
這個類提供一個同步訪問對象的架構。 |
Mutex |
為一個線程提供共享資源獨占訪問的一個同步原型。也可用於內部進程同步。 |
ReaderWriterLock |
定義一個允許單寫-多讀語法。 |
RegisteredWaitHandle |
這個類表示一個當調用RegisterWaitForSingleObject()方法注冊的句柄。 |
SynchronizationLockException |
當一個同步方法從一個異步代碼塊調用的時候拋出這個異常。 |
Thread |
這個類創建並控制一個線程,設置線程優先級並獲取其狀態。 |
ThreadAbortException |
當調用Abort()方法時拋出這個異常。 |
ThreadExceptionEventArgs |
為ThreadException事件提供數據。 |
ThreadInterruptedException |
當線程處於wating狀態時的異常中斷會導致這個異常。 |
ThreadPool |
這個類提供一個可以用來執行工作,處理異步I/O,等待其他線程以及處理定時器的線程池。 |
ThreadStateException |
當方法調用的時候且線程處於一個不合法的狀態時拋出這個異常。 |
Timeout |
這個類簡單地包含了一個我們想要確定特定時間的常量。 |
Timer |
這個類提供在特定間隔中執行方法的結構。 |
WaitHandle |
這個類將等待對一個共享資源獨享訪問的操作系統對象封裝起來。 |
我們不會在這部分所有的類,但是知道這個命名空間為我們提供了哪些類是很重要的。其他類將會在后續章節討論。
線程類
到目前為止,我們將要重點討論線程類,因為這個類表示了我們使用的進程。這個類允許我們做很多事情,從管理一個線程的優先級到讀線程的狀態。
讓我們從查看這個類的公共方法的表格開始。
公共方法名 | 描述 |
Abort() | 這個重載方法在它被調用的線程中引發一個ThreadAbortException, 並開始終止線程的過程。調用這個方法通常會終止線程。 |
AllocateDataSlot() | 這個靜態方法在所有線程上分配一個未命名的數據槽。 |
AllocateNamedSlot() | 這個靜態方法在所有線程上分配一個命名的數據槽。 |
FreeNamedDataSlot() | 這個靜態方法釋放一個之前分配的命名數據槽。 |
GetData() | 這個靜態方法從當前線程的當前應用程序域特定位置收集數據。 |
GetDomain() | 這個靜態方法返回當前線程所屬的當前應用程序域。 |
GetDomainID() | 這個靜態方法返回一個唯一的應用程序域標志。 |
GetHashCode() | 這個方法作為一個特定類型的哈希函數,適用於哈希算法和數據結構(哈希表)。 |
GetNamedDataSlot() | 這個靜態方法尋找一個命名的數據槽。 |
Interrupt() | 這個方法中斷狀態為WaitSleepJoin的線程。 |
Join() | 這個重載方法阻塞調用線程直到一個線程終止。 |
ResetAbort() | 這個靜態方法為當前線程取消Abort()請求。 |
Resume() | 這個方法恢復阻塞的線程。 |
SetData() | 這個靜態方法為線程的當前程序域設定數據。 |
Sleep() | 這個靜態重載方法按照特定毫秒阻塞當前線程。 |
SpinWait() | 這個靜態方法導致一個線程等待由迭代參數定義的時間。 |
Start() | 這個方法會導致操作系統將當前線程的狀態置成ThreadState.Running. |
Suspend() | 這個方法會阻塞線程,如果當前線程已經阻塞,會不起作用。 |
現在讓我們看看另外一張表,這次包含了線程的公共屬性。
公共屬性名 | 描述 |
ApartmentState | 或者或者設置當前線程的單元狀態。 |
CurrentContext | 這個靜態屬性獲取正在執行的線程的上下文。 |
CurrentCulture | 獲取或者設置當前線程的文化背景。 |
CurrentPrincipal | 這個靜態屬性獲取或設置線程當前的身份。對基於角色的安全很重要。 |
CurrentThread | 這個靜態屬性獲取當前正在運行的線程。 |
CurrentUICulture | 在運行時使用,這個屬性被資源管理器用來尋找特定文化資源。 |
IsAlive | 獲取當前線程執行狀態值。 |
IsBackground | 獲取或設置當前線程是不是后台線程。 |
IsThreadPoolThread | 獲取當前線程是不是一個線程池的一部分。 |
Name | 獲取或者設置當前線程名。 |
Priority | 獲取或者設置一個線程的執行優先級。 |
ThreadState | 獲取當前線程的狀態。 |
再次,我們不會在這一章使用所有公共屬性。我們已經看過了這些類成員,但是除了我們使用它們創建一個線程否則對我們來說它們沒什么用。所以下一篇我們將會創建一個簡單的C#線程示例。