????????每個正在操作系統上運行的應用程序都是一個進程,一個進程可以包括一個或多個線程。線程是操作系統分配處理器時間的基本單元,在進程中可以有多個線程同時執行代碼。每個線程都維護異常處理程序、調度優先級和一組系統用于在調度該線程前保存線程上下文的結構。線程上下文包括為使線程在線程的宿主進程地址空間中無縫地繼續執行所需的所有信息,包括線程的CPU寄存器組和堆棧。
一、線程基礎
1.單線程?
????????單線程顧名思義,就是只有一個線程。默認情況下,系統為應用程序分配一個主線程,該線程執行程序中以Main()方法開始和結束的代碼。
2.多線程
????????需要用戶交互的軟件都必須盡可能快地對用戶的活動做出反應,以便提供豐富多彩的用戶體驗,但同時它又必須執行必要的計算以便盡可能快地將數據呈現給用戶,這時可以使用多線程來實現。
???????(1)多線程的缺點
要提高對用戶的響應速度并且處理所需數據以便幾乎同時完成工作,使用多線程是一種最為強大的技術,在具有一個處理器的計算機上,多線程可以通過利用用戶事件之間很小的時間段在后臺處理數據來達到這種效果。例如,通過使用多線程,在另一個線程正在重新計算同一應用程序中的電子表格的其他部分時,用戶可以編輯該電子表格。
單個應用程序域可以使用多線程來完成以下任務。
? 通過網絡與Web服務器和數據庫進行通信。
? 執行占用大量時間的操作。
? 區分具有不同優先級的任務。
? 使用戶界面可以在將時間分配給后臺任務時仍能快速做出響應。?
???????(2)多線程的缺點
使用多線程有好處,同時也有壞處,建議一般不要在程序中使用太多的線程,這樣可以最大限度地減少操作系統資源的使用,并可提高性能。
如果在程序中使用了多線程,可能會產生如下問題。
? 系統將為進程、AppDomain對象和線程所需的上下文信息使用內存。因此,可以創建的進程、AppDomain對象和線程的數目會受到可用內存的限制。
? 跟蹤大量的線程將占用大量的處理器時間。如果線程過多,則其中大多數線程都不會產生明顯的進度。如果大多數當前線程處于一個進程中,則其他進程中的線程的調度頻率就會很低。
? 使用許多線程控制代碼執行非常復雜,并可能產生許多bug。
? 銷毀線程需要了解可能發生的問題并對那些問題進行處理。
二、線程操作
????????Thread類位于System.Threading命名空間下,System.Threading命名空間提供一些可以進行多線程編程的類和接口。除同步線程活動和訪問數據的類(Mutex、Monitor、Interlocked和AutoResetEvent 等)外,該命名空間還包含一個ThreadPool類(它允許用戶使用系統提供的線程池)和一個Timer類(它在線程池的線程上執行回調方法)。
????????Thread類主要用于創建并控制線程、設置線程優先級并獲取其狀態。一個進程可以創建一個或多個線程以執行與該進程關聯的部分程序代碼,線程執行的程序代碼由ThreadStart委托或ParameterizedThreadStart委托指定。
????????線程運行期間,不同的時刻會表現為不同的狀態,但它總是處于由ThreadState定義的一個或多個狀態中。用戶可以通過使用ThreadPriority枚舉為線程定義優先級,但不能保證操作系統會接受該優先級。
????????Thread類的常用屬性及說明如表
屬 ???性 | 說 ???明 |
????ApartmentState | ???狀取或設置此線程的單元狀態 |
????CurrentContex | 獲取線程正在其中執行的當前上下文 |
????CurrentThread | ???獲取當前正在運行的線程 |
????isAlive | 獲取一個值,該值指示當前線程的執行狀態 |
????ManagedThreadld | 獲取當前托管線程的唯一標識符 |
????Name | ???獲取或設置線程的名稱 |
????Priority | 獲取或設置一個值,該值指示線程的調度優先級 |
????ThreadState | 獲取一個值,該值包含當前線程的狀態 |
????????Thread類的常用方法及說明如表
方 ??法 | 說 ??明 |
???Abort | 在調用此方法的線程上引發ThreadAbortException,以開始終止此線程的過程。調用此方法通常會終止線程 |
???GetApartmentState | 返回一個ApartmentState值,該值指示單元狀態 |
???GetDomain | 返回當前線程正在其中運行的當前域 |
???GetDomainID | 返回唯一的應用程序域標識符 |
???Interrupt | 中斷處于WaitSleepJoin線程狀態的線程 |
???Join | 阻止調用線程,直到某個線程終止時為止 |
???ResetAbort | 取消為當前線程請求的Abort |
???Resume | 維續已掛起的線程 |
???SetApartmentState | 在線程啟動前設置其單元狀態 |
???Sleep | 將當前線程阻止指定的毫秒數 |
???SpinWait | 導致線程等待由iterations參數定義的時間量 |
???Start | 使線程被安排進行執行 |
???Suspend | 掛起線程,或者如果線程已掛起,則不起作用 |
???VolatileRead | 讀取字段值。無論處理器的數目或處理器緩存的狀態如何,該值都是由計算機的任何處理器寫入的最新值 |
???VolatileWrite | 立即向字段寫入一個值,以使該值對計算機中的所有處理器都可見 |