創建多線程應用程序和應用程序域

5.使用程序集屬性向元數據添加自定義信息 
進程:任何應用程序在執行期間都被稱爲一個進程
線程:線程是一個執行單元。 每個進程至少要包含一個線程。
用於直接管理線程的主要類是 Thread 類
衍生新線程 :創建線程的過程
使線程進入休眠狀態 :銷燬一個現有線程的過程稱爲註銷或終止線程,暫停線程的過程
構造函數:構造函數用於初始化 Thread 類的新實例。Thread 類具有以下構造函數:
Thread(ThreadStart):初始化 Thread 類的新實例。
Thread(ParameterizedThreadStart):初始化 Thread 類的新實例,指定允許在啓動線程時將對象傳遞給線程的委託。
Thread(ThreadStart, Int32):初始化 Thread 類的新實例,指定線程的最大堆棧大小。
Thread(ParameterizedThreadStart, Int32):初始化 Thread 類的新實例,指定允許在線程啓動時將對象傳遞給線程的委託,並指定線程的最大堆棧大小。
CurrentContext 屬性:這是一個只讀屬性。它由 .NET Framework 內部使用,以確定線程是否需要諸如同步、事務處理和安全性等的服務。
CurrentCulture 屬性:你可以使用該屬性獲取或設置當前線程的區域性信息,而此信息爲CultureInfo 類型。默認情況下,CurrentCulture 屬性包括“控制面板”中區域設置選項中的所選區域。
CurrentPrincipal 屬性:你可以使用此屬性獲取或設置運行線程所使用的主體。主體用於控制基於角色的安全性,它們包括用戶名(以其名義來執行線程)和成員信息(例如,用戶所屬的組)。
CurrentThread 屬性:這是一個只讀靜態屬性。你可以使用此屬性來了解當前正在執行的線程。例如,可以使用以下代碼行來驗證正在運行的線程的 CurrentCulture 屬性值。System.Thread.CurrentThread.CurrentCulture
CurrentUICulture 屬性: 資源管理器使用此屬性在運行時查找區域性特定的資源。當應用程序使用具有不同區域性設置的本地資源文件時,此功能非常有用。例如,要自動設置資源管理器以查找用戶所選區域的資源文件,請打開“控制面板”上的“設置”,然後將以下代碼行添加到窗體構造函數中。Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture
ExecutionContext 屬性:這是一個只讀屬性,它提供對線程所使用的上下文信息(例如,同步、事務處理和安全性)的訪問權。
IsAlive 屬性:這是一個只讀 Boolean 屬性。可以使用此屬性來確認線程是啓動了、還是尚未完成、或是終止了分配給它的任務。
IsBackground 屬性:可以使用此屬性來判斷線程是否爲後臺線程,也可以使用該屬性將線程設置爲後臺線程。後臺線程是不阻止進程結束的線程,即使仍有後臺線程在執行,但只要所有前臺線程都結束了,就可以終止進程。
IsThreadPoolThread 屬性:這是一個只讀屬性。可以使用此屬性來判斷線程是否爲線程池的一部分。
ManagedThreadId 屬性:這是一個只讀屬性。可以使用此屬性來獲得線程 ID。此 ID 是CLR用來識別線程的惟一的整數標識符。
Name 屬性:可以使用此屬性獲取或設置線程的名稱。它是一個string類型,只能寫一次。只有在監視線程時,Name 屬性纔有用。
Priority 屬性:可以使用此屬性獲取或設置線程的優先級。操作系統使用優先級來確定在給定時間內哪個線程需要處理。此屬性是ThreadPriority類型,而ThreadPriority是一個枚舉類型,其值如下:
Highest:具有此優先級的線程將被安排在具有任何其他優先級的線程之前。
AboveNormal:具有此優先級的線程將被安排在具有 Highest 優先級的線程之後,但在具有 Normal 優先級的線程之前。
Normal:具有此優先級的線程將被安排在具有 AboveNormal 優先級的線程之後,但在具有 BelowNormal 優先級的線程之前。線程的默認優先級爲 Normal 優先級。
BelowNormal:具有此優先級的線程將被安排在具有 Normal 優先級的線程之後,但在具有 Lowest 優先級的線程之前。
Lowest:具有此優先級的線程將被安排在具有任何其他優先級的線程之後。
ThreadState 屬性:這是一個只讀屬性。你可以使用此屬性來查看線程的狀態。此屬性是ThreadState類型,而ThreadState是一個枚舉類型,其值如下:
Aborted:線程處於 Stopped 狀態中。
AbortRequested:已對線程調用了 Thread.Abort 方法,但此線程尚未收到嘗試終止此線程的掛起的System.Threading.ThreadAbortException。
Background:線程正作爲後臺線程運行(相對於前臺線程而言)。此狀態可通過設置 Thread.IsBackground 屬性來控制。
Running:線程已啓動,它未被阻塞,且無掛起的 ThreadAbortException。
Stopped:線程已停止。
StopRequested:正在請求線程停止。僅用於內部。
Suspended:線程已掛起。
SuspendRequested:正在請求線程掛起。
Unstarted:尚未對線程調用 Thread.Start 方法。
WaitSleepJoin:由於調用 Wait、Sleep 或 Join,線程已被阻塞。
Abort 方法:你可以使用此方法引發異常和使線程停止運行。它有兩個重載方法,一個無參數,而另一個有一個object類型的參數,它們用於傳遞有中止線程意圖的異常。
BeginThreadAffinity 方法:這是一個靜態方法。線程關聯意味着你想將某些事物綁定到線程。如果調用 BeginThreadAffinity 方法,則任何由線程執行的代碼隨後都將在此線程的上下文中執行。如果宿主應用程序提供其自己的線程處理機制,而該機制允許將線程從一個進程移到另一個進程,則可能需要此方法。
EndThreadAffinity 方法:這是一個靜態方法。你可以將其與 BeginThreadAffinity 結合使用,來確定在線程內根據進程標識要要執行的代碼部分。
GetApartmentState 方法:可以使用此方法來獲取線程的單元狀態。
GetData 方法:這是一個靜態方法。你可以使用它來讀取指定內存槽中的數據。內存槽中的數據是通過使用 SetData 方法來創建的,這些數據僅供當前線程使用,甚至子線程也不能訪問這些數據。
GetDomain 方法:這是一個靜態方法。你可以使用它來檢索一個AppDomain類型的對象,該對象表示線程在其中運行的應用程序域。
GetDomainId 方法:這是一個靜態方法。你可以使用它來檢索其中運行線程的應用程序域的域ID。
Interrupt 方法:如果線程被阻塞在 Wait、Sleep 或 Join 狀態,則可以使用此方法拋出只可被代碼捕捉的 ThreadInterruptedException。
Join 方法:可以使用此方法阻止線程繼續執行,直到完成其他線程或超過指定時間段。
ResetAbort 方法:這是一個靜態方法。你可以使用它來取消發送給當前線程的中止,還可以使用它來取消由代碼(使用由用戶組件創建的線程)發送的可能中止。
SetApartmentState 方法:可以使用此方法更改單元狀態。
SetData 方法:可以使用此方法將數據保存到某個僅供線程訪問的特殊內存槽中。
Sleep 方法:可以使用此方法使線程在指定時間內停止處理。
SpinWeight 方法:可以使用此方法使線程停止被處理指定的處理器反覆次數。
Start 方法:你可以使用此方法啓動線程。
TryApartmentState 方法:你可以使用此方法設置線程的 ApartmentState 屬性。如果狀態發生更改,則此方法將返回 true,否則,返回 false。你必須在第一次調用使用單元模型的非託管代碼之前設置 ApartmentState 屬性,因爲調用之後再直接更改該屬性將導致異常,但是,你可以改用 TryApartmentState 方法來更改線程的狀態。
VolatileRead 方法:這是一個靜態方法。可以使用它來讀取由任何處理器寫入指定字段的最新值。還可以將此方法與 VolatileWrite 結合使用,以強制執行直接內存訪問,而不用經過緩存。另外,此機制還可用於實現數據同步,但使用鎖定機制來實現將更爲簡單。
VolatileWrite 方法:這是一個靜態方法。可以使用它將數據寫入直接進入內存的字段中,並讓所有處理器都可以使用此數據。此方法還將導致處理器緩存的刷新。另外,此機制還可用於實現數據同步,但是用鎖定機制來實現數據同步會簡單一些。
通過使用 ThreadPool 類管理線程池
不應該使用線程池的情況:
1.需要前臺線程
2.需要某個線程具有特定的優先級
3.具有可以阻塞線程一段時間的任務
4.需要將某些線程放置在單線程的單元中
5.需要有與線程關聯的穩定標識,或需要將某個線程專用於某個任務
ThreadPool 類的成員 :
BindHandle:BindHandle 方法將操作系統句柄綁定到線程池。你可以使用句柄來引用資源(例如文件)。
GetAvailableThreads:GetAvailableThreads 方法檢索線程池中可用的空閒線程的數目。該值爲池中最大線程數目與當前活動線程數目的差值。
GetMaxThreads:GetMaxThreads 方法檢索線程池中最大線程數。如果發出的線程請求數大於最大線程數,則這些請求將在隊列中等待,直到有線程可用爲止。
GetMinThreads:GetMinThreads 方法檢索線程池中預先爲響應新請求而創建的空閒線程數。
QueueUserWorkItem:QueueUserWorkItem 方法向線程池隊列添加請求。一旦池中有線程可用,線程池就立即執行該請求。它有兩個重載方法,一個通過使用 ThreadStart 委託來啓動線程,另一個通過使用 ParameterizedThreadStart 委託來啓動線程。
RegisterWaitForSingleObject:RegisterWaitForSingleObject 方法僅當句柄獲得信號時才向線程池添加啓動線程的請求。在句柄獲得信號之後,它將請求添加到線程池隊列並在有空閒線程可用時就立即執行。它有四種重載方法,分別將超時時間指定爲整數、無符號整數、long或時間間隔。作爲線程起始點傳遞的回調方法必須接受兩個參數,一個是將數據傳遞給線程的對象,另一個爲Boolean 值(在該方法中設置它以指示該調用是否超時)。
SetMaxThreads:SetMaxThreads 方法設置線程池可容納的線程請求數。當隊列的請求數大於此數時,多餘的請求仍需在隊列中繼續等待,直到線程池中有其它線程可用爲止。
SetMinThreads:SetMinThreads 方法設置線程池中可用空閒線程數,即使預計傳入的請求中沒有活動的線程也一樣。
管理異步環境中的線程
1.異步編程
2.使用異步類型來管理回調方法
3.通過異步調用遷移線程的執行上下文
4.使用 SynchronizationContext 來管理異步環境
使用異步類型來管理回調方法
AsyncState:可以使用 AsyncState 屬性來獲取一個用戶定義的對象,而該對象用作 BeginInvoke 方法的最新參數。此對象被稱爲調用狀態。
AsynWaitHandle:你可以使用 AsyncWaitHandle 屬性來向 BeginInvoke 方法所創建的線程發送信號。
CompletedSynchronously CompletedSynchronously 屬性是一個 Boolean 屬性。你可以使用該屬性來驗證主線程是否執行了由 BeginInvoke 啓動的調用。大多數情況下,對該屬性的調用都返回一個 false。但是,.NET Framework 中的一些類使用邏輯來確定是否應同步解析異步調用,例如是否讀取一個小文件。
IsCompleted:IsCompleted 屬性是一個 Boolean 屬性。你可以使用該屬性確定一個異步調用是否完成。
通過異步調用遷移線程的執行上下文
ExecutionContext 和 HostExecutionContextManager 類 :
ExecutionContext:ExecutionContext 類可用於管理上下文從一個線程傳播到另一個線程。該類可與主體結合使用,以設置線程的安全上下文並決定是否傳播該上下文。當調用線程時,你可以將ExecutionContext 類和HostExecutionContext 類結合使用,以模擬CLR宿主執行上下文。你還可以將 ExecutionContext 類和HostExecutionContextManager 類結合使用以控制CLR宿主應用程序所使用的上下文。
HostExcutionContextManager:HostExecutionContext 類可用於獲取正在執行的 CLR 宿主所使用的執行上下文。該類的一個重要方法是 CreateCopy 方法,當調用異步方法時,該方法用於創建一個將被使用的宿主執行上下文的副本。
HostExecutionContextManager 類可用於控制正在執行的 CLR 宿主所使用的執行上下文。
Capture Capture 方法用於獲取一個表示當前線程上下文的 ExecutionContext 對象。
CreateCopy:CreateCopy 方法創建一個新的ExecutionContext 對象,其上下文與現有ExecutionContext的上下文相同。由於不同的應用程序域不能共享同一個執行上下文,所以此操作的目的是在應用程序域外創建一個新線程,讓它具有相同的上下文。
IsFlowSuppressed:IsFlowSuppressed 方法是一個 Boolean 方法。你可以使用該方法確認是否已取消執行上下文的流。因爲,在默認情況下,對新線程的調用都使用同一執行上下文。
RestoreFlow:RestoreFlow 方法是一個 Boolean 屬性,並且可以用於確認異步調用是否完成。RestoreFlow 方法由AsyncFlowControl 結構的 Undo 方法調用,並由 SuppressFlow 方法返回。要恢復執行上下文的流,應使用 AsyncFlowControl 結構的 Undo 方法,而不是使用 RestoreFlow 方法。
Run:Run 方法可通過委託來調用某個方法,而它要使用的上下文將作爲參數傳給它。
SuppressFlow:SuppressFlow 方法可用於取消執行上下文從一個線程傳播到另一個線程。
Capture:Capture 方法可用於獲取表示 CLR 宿主上下文的 ExecutionContext 對象。
Revert:Revert 方法可用於將執行上下文恢復到先前狀態。
SetHostExecutionContext:SetHostExecutionContext 方法可用於設置當前 ExecutionHostContext 的上下文。
使用 SynchronizationContext 來管理異步環境
SynchronizationContext 類的成員
Current:Current 屬性返回當前線程的同步上下文。
CreateCopy:CreateCopy 方法創建當前線程的同步上下文的副本。
IsWaitNotificationRequired:IsWaitNotificationRequired 方法可用於確定是否需要等待通知。
OperationCompleted:OperationCompleted 方法可用於響應操作已完成的通知。
OperationStarted:OperationStarted 方法可用於響應操作已啓動的通知。
Post:Post 方法可用於啓動一個與調用方線程具有相同同步上下文的新線程。
Send:Send 方法可用於將一個方法與當前線程的同步上下文同步運行。
SetSynchronizationContext:SetSynchronizationContext 方法可用於設置當前線程的同步上下文。
Wait:Wait 方法可用於向線程發送信號,並在其他線程完成以前暫停調用方線程。
應用程序域的工作原理:
1.應用程序域
2.通過使用AppDomainSetup類來配置應用程序域
3.使用 AppDomain類來創建應用程序域
4.從應用程序域檢索設置信息
5.將程序集加載到應用程序域
6.通過使用 AppDomain類來卸載應用程序域
應用程序域:
應用程序域用作隔離多個應用程序的訪問邊界
應用程序域由 System.AppDomain類表示,並在需要時由CLR自動創建
應用程序域和線程之間不具有一對一的相關性
通過使用AppDomainSetup類來配置應用程序域
AppDomainSetup類的成員 :
ApplicationBase:ApplicationBase屬性可用於獲取或設置應用程序的目錄路徑。
ApplicationName:ApplicationName屬性可用於獲取或設置應用程序名稱。
ConfigurationFile:ConfigurationFile屬性可用於獲取或設置應用程序域的配置文件名稱。
使用 AppDomain類來創建應用程序域
1.通過使用 AppDomain類可以創建應用程序域,該類的主要方法是CreateDomain方法
2.使用CreateDomain方法來創建一個基於現有AppDomainSetup對象的新應用程序域
3.創建應用程序域後,使用 AppDomain類的各個成員進行檢索並應用各種設置
拋出CannotUnloadAppDomainException類型的異常原因
1.嘗試卸載默認應用程序域
2.嘗試卸載一個已卸載的應用程序域
3.此時有線程無法停止執行

發佈了44 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章