天天看點

細說程序、應用程式域與上下文之間的關系(三)—— 深入了解.NET上下文

目錄

<a target="_blank" href="http://blog.51cto.com/2689556/836719">一、程序的概念與作用</a>

<a target="_blank" href="http://blog.51cto.com/2689556/836724">二、應用程式域</a>

<a target="_blank" href="http://blog.51cto.com/2689556/836728">三、深入了解.NET上下文</a>

<a target="_blank" href="http://blog.51cto.com/2689556/836740">四、程序應用程式域與線程的關系</a>

三、深入了解.NET上下文

3.1 .NET上下文的概念

應用程式域是程序中承載程式集的邏輯分區,在應用程式域當中,存在更細粒度的用于承載.NET對象的實體,那就.NET上下文Context。

所有的.NET對象都存在于上下文當中,每個AppDomain當中至少存在一個預設上下文(context 0)。

一般不需要指定特定上下文的對象被稱為上下文靈活對象(context-agile),建立此對象不需要特定的操作,隻需要由CLR自行管理,一般這些對象都會被建立在預設上下文當中。

<a href="http://blog.51cto.com/attachment/201204/161506401.jpg" target="_blank"></a>

圖3.0

3.2 透明代理

在上下文的接口當中存在着一個消息接收器負責檢測攔截和處理資訊,當對象是MarshalByRefObject的子類的時候,CLR将會建立透明代理,實作對象與消息之間的轉換。

應 用程式域是CLR中資源的邊界,一般情況下,應用程式域中的對象不能被外界的對象所通路。而MarshalByRefObject 的功能就是允許在支援遠端處理的應用程式中跨應用程式域邊界通路對象,在使用.NET Remoting遠端對象開發時經常使用到的一個父類。

3.3 上下文綁定

當系統需要對象使用消息接收器機制的時候,即可使用ContextBoundObject類。ContextBoundObject繼承了MarshalByRefObject類,保證了它的子類都會通過透明代理被通路。

在 第一節介紹過:一般類所建立的對象為上下文靈活對象(context-agile),它們都由CLR自動管理,可存在于任意的上下文當中。而 ContextBoundObject 的子類所建立的對象隻能在建立它的對應上下文中正常運作,此狀态被稱為上下文綁定。其他對象想要通路ContextBoundObject 的子類對象時,都隻能通過代透明理來操作。

下面的例子,是上下文綁定對象與上下文靈活對象的一個對比。Example 是一個普通類,它的對象會運作在預設上下文當中。而ContextBound類繼承了ContextBoundObject,它的對象是一個上下文綁定對 象。ContextBound還有一個Synchronization特性,此特性會保證ContextBound對象被加載到一個線程安全的上下文當中 運作。另外,Context類存在ContextProperties屬性,通過此屬性可以擷取該上下文的已有資訊。

運作結果

<a href="http://blog.51cto.com/attachment/201204/161533203.jpg" target="_blank"></a>

由運作結果可以發現,example對象一般隻會工作于預設上下文context 0 當中,而contextBound則會工作于線程安全的上下文 context 1當中。當example需要調用contextBound對象時,就會通過透明代理把消息直接傳遞到context 1中。

<a></a>

本文轉自 leslies2  51CTO部落格,原文連結:http://blog.51cto.com/79100812/836728

繼續閱讀