目錄
<a href="http://blog.51cto.com/2689556/836719" target="_blank">一、程序的概念與作用</a>
<a href="http://blog.51cto.com/2689556/836724" target="_blank">二、應用程式域</a>
<a href="http://blog.51cto.com/2689556/836728" target="_blank">三、深入了解.NET上下文</a>
<a href="http://blog.51cto.com/2689556/836740" target="_blank">四、程序應用程式域與線程的關系</a>
四、程序、應用程式域、線程的互相關系
4.1 跨AppDomain運作代碼
在應用程式域之間的資料是相對獨立的,當需要在其他AppDomain當中執行目前 AppDomain中的程式集代碼時,可以使用CrossAppDomainDelegate委托。把CrossAppDomainDelegate委托 綁定方法以後,通過AppDomain的DoCallBack方法即可執行委托。
運作結果
<a target="_blank" href="http://blog.51cto.com/attachment/201204/162027747.jpg"></a>
4.2 跨AppDomain的線程
線程存在于程序當中,它在不同的時刻可以運作于多個不同的AppDomain當中。它是程序 中的基本執行單元,在程序入口執行的第一個線程被視為這個程序的主線程。在.NET應用程式中,都是以Main()方法作為入口的,當調用此方法時 系統就會自動建立一個主線程。線程主要是由CPU寄存器、調用棧和線程本地存儲器(Thread Local Storage,TLS)組成的。CPU寄存器主要記錄目前所執行線程的狀态,調用棧主要用于維護線程所調用到的記憶體與資料,TLS主要用于存放線程的狀 态資訊。
下面的例子将介紹一下如何跨AppDomain使用線程,首先建立一個ConsoleApplication項目,在執行時輸入目前線程及應用程式域的資訊,最後生成Example.exe的可執行程式。
然後再建立一個ConsoleApplication項目,在此項目中新一個AppDomain對象,在新的AppDomain中通過ExecuteAssembly方法執行Example.exe程式。
<a target="_blank" href="http://blog.51cto.com/attachment/201204/162044710.jpg"></a>
可見,ID等于9的線程在不同時間内分别運作于AppDomain 1與AppDomain 2當中。
4.3 跨上下文的線程
線程既然能夠跨越AppDomain的邊界,當然也能跨越不同的上下文。
下面這個例子中,線程将同時運作在預設上下文與提供安全線程的上下文中。
<a target="_blank" href="http://blog.51cto.com/attachment/201204/162101786.jpg"></a>
本篇總結
程序(Process)、線程(Thread)、應用程式域(AppDomain)、上下文 (Context)的關系如圖5.0,一個程序内可以包括多個應用程式域,也有包括多個線程,線程也可以穿梭于多個應用程式域當中。但在同一個時刻,線程 隻會處于一個應用程式域内。線程也能穿梭于多個上下文當中,進行對象的調用。
雖然程序、應用程式域與上下文在平常的開發中并非經常用到,但深入地了解三者的關系,熟悉其操作方式對合理利用系統的資源,提高系統的效率是非常有意義的。
尤其是三者與線程之間的關系尤為重要,特别是在一個多線程系統中,如果不能理清其關系而盲目使用多線程,容易造成資源搶占與死鎖之類的錯誤。
<a target="_blank" href="http://blog.51cto.com/attachment/201204/162223358.jpg"></a>
圖5.0
希望本篇文章對相關的開發人員有所幫助。
本文轉自 leslies2 51CTO部落格,原文連結:http://blog.51cto.com/79100812/836740