目录

一、进程的概念与作用

二、应用程序域

三、深入了解.NET上下文

四、进程应用程序域与线程的关系

三、深入了解.NET上下文

3.1 .NET上下文的概念

应用程序域是进程中承载程序集的逻辑分区,在应用程序域当中,存在更细粒度的用于承载.NET对象的实体,那就.NET上下文Context。
所有的.NET对象都存在于上下文当中,每个AppDomain当中至少存在一个默认上下文(context 0)。
一般不需要指定特定上下文的对象被称为上下文灵活对象(context-agile),建立此对象不需要特定的操作,只需要由CLR自行管理,一般这些对象都会被建立在默认上下文当中。

图3.0

3.2 透明代理

在上下文的接口当中存在着一个消息接收器负责检测拦截和处理信息,当对象是MarshalByRefObject的子类的时候,CLR将会建立透明代理,实现对象与消息之间的转换。
应 用程序域是CLR中资源的边界,一般情况下,应用程序域中的对象不能被外界的对象所访问。而MarshalByRefObject 的功能就是允许在支持远程处理的应用程序中跨应用程序域边界访问对象,在使用.NET Remoting远程对象开发时经常使用到的一个父类。
此文章针对的是进程与应用程序域的作用,关于MarshalByRefObject的使用已经超越了本文的范围,关于.NET Remoting 远程对象开发可参考:“回顾.NET Remoting分布式开发”。

3.3 上下文绑定

当系统需要对象使用消息接收器机制的时候,即可使用ContextBoundObject类。ContextBoundObject继承了MarshalByRefObject类,保证了它的子类都会通过透明代理被访问。
在 第一节介绍过:一般类所建立的对象为上下文灵活对象(context-agile),它们都由CLR自动管理,可存在于任意的上下文当中。而 ContextBoundObject 的子类所建立的对象只能在建立它的对应上下文中正常运行,此状态被称为上下文绑定。其他对象想要访问ContextBoundObject 的子类对象时,都只能通过代透明理来操作。

下面的例子,是上下文绑定对象与上下文灵活对象的一个对比。Example 是一个普通类,它的对象会运行在默认上下文当中。而ContextBound类继承了ContextBoundObject,它的对象是一个上下文绑定对 象。ContextBound还有一个Synchronization特性,此特性会保证ContextBound对象被加载到一个线程安全的上下文当中 运行。另外,Context类存在ContextProperties属性,通过此属性可以获取该上下文的已有信息。

 1     class Program
 2     {
 3         public class Example
 4         {
 5             public void Test()
 6             {
 7                 ContextMessage("Example Test\n");
 8             }
 9             //访问上下文绑定对象测试10             public void Sync(ContextBound contextBound)
11             {
12                 contextBound.Test("Example call on contextBound\n");
13             }
14         }
15
16         [Synchronization]
17         public class ContextBound:ContextBoundObject
18         {
19             public void Test(string message)
20             {
21                 ContextMessage(message);
22             }
23         }
24
25         static void Main(string[] args)
26         {
27             Example example = new Example();
28             example.Test();
29             ContextBound contextBound = new ContextBound();
30             contextBound.Test("ContentBound Test\n");
31             example.Sync(contextBound);
32             Console.ReadKey();
33         }
34
35         //显示上下文信息36         public static void ContextMessage(string data)
37         {
38             Context context = Thread.CurrentContext;
39             Console.WriteLine(string.Format("{0}ContextId is {1}", data, context.ContextID));
40             foreach (var prop in context.ContextProperties)
41                 Console.WriteLine(prop.Name);
42             Console.WriteLine();
43         }
44     }

运行结果

由运行结果可以发现,example对象一般只会工作于默认上下文context 0 当中,而contextBound则会工作于线程安全的上下文 context 1当中。当example需要调用contextBound对象时,就会通过透明代理把消息直接传递到context 1中。

转载于:https://blog.51cto.com/79100812/836728

细说进程、应用程序域与上下文之间的关系(三)—— 深入了解.NET上下文相关推荐

  1. [转]C#综合揭秘——细说进程、应用程序域与上下文之间的关系

    引言 本文主要是介绍进程(Process).应用程序域(AppDomain)..NET上下文(Context)的概念与操作. 虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提 ...

  2. 细说进程、应用程序域与上下文之间的关系(一)——进程的概念与作用

    引言 本文主要是介绍进程(Process).应用程序域(AppDomain)..NET上下文(Context)的概念与操作. 虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提 ...

  3. 【数字信号处理】序列傅里叶变换 ( 序列傅里叶变换与反变换 | 序列绝对可和 与 存在傅里叶变换之间的关系 | 序列傅里叶变换性质 )

    文章目录 一.序列傅里叶变换与反变换 二.序列绝对可和 与 存在傅里叶变换之间的关系 三.序列傅里叶变换性质 一.序列傅里叶变换与反变换 在上一篇博客 [数字信号处理]序列傅里叶变换 ( 序列傅里叶变 ...

  4. 正交,独立,相关及之间的关系

    一.'独立','不相关'和'正交'的定义 二."独立"."不相关"和"正交"之间的关系 三.线性无关.线性相关与正交的关系 正交必线性无关, ...

  5. 进程 、进程组、会话、控制终端之间的关系

    一个进程组可以包含多个进程 进程组中的这些进程之间不是孤立的,他们彼此之间或者存在者父子.兄弟关系,或者在功能有相近的联系. 那linux为什么要有进程组呢?其实提供进程组就是方便管理这些进程.假设要 ...

  6. 【Linux进程、线程、任务调度】一 Linux进程生命周期 僵尸进程的含义 停止状态与作业控制 内存泄漏的真实含义 task_struct以及task_struct之间的关系

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 文章目录 1 ...

  7. worker进程和task进程区别_worker进程和task进程区别_Storm概念学习系列之Worker、Task、Executor三者之间的关系......

    不多说,直接上干货! Worker.Task.Executor三者之间的关系 Storm集群中的一个物理节点启动一个或者多个Worker进程,集群的Topology都是通过这些Worker进程运行的. ...

  8. 详解窗口句柄,进程ID,进程句柄,窗口与进程之间的关系

    窗口句柄: 在Windows或Linux等操作系统下窗口句柄对应着每个窗口的钥匙,例如,你要对某一个窗口进行操作,你必须知道你要操作哪一个窗口,这里就拿Windows做举例,Windows下几乎会创建 ...

  9. linux+kill+进程和线程,什么是程序,进程和线程?三者之间有何关系?

    进程 进程与线程的历史 进程与线程之间的关系 重点 进程 和 线程的概念 进程和程序关系 cpu在执行程序时什么叫进程 swap 内存的缺页异常 大的异常 小的异常 内存映射mmap 内存泄露 tas ...

  10. 多CPU ,多核和进程以及多线程之间的关系

    今天开始,这个专题主要讲解 java 并发编程系列,从操作系统的进程.CPU.线程等底层开始, 到java 并发工具类,线程.线程池,并发容器.CAS.AQS等原理.源码和使用均做深入的解析.今天讲 ...

最新文章

  1. 字典树(trie树)、后缀树
  2. 【机器视觉】 dev_update_window算子
  3. Java中 ArrayList类常用方法和遍历
  4. 计算机不属于发明保护客体,如何判断两种类型的计算机程序发明能否成为专利保护客体?...
  5. 可视化理解卷积神经网络 - 反卷积网络 - 没看懂
  6. 微软最有价值专家(MVP)四连任
  7. 小爱mini改aux立体声_拆解报告:Redmi小爱音箱Play
  8. 单片机超声波测距模块原理与源码解析
  9. stc15f2k60s2单片机开发环境构建
  10. linux消息队列默认长度,Linux 消息队列长度处理
  11. spyder顺眼配色方案记录
  12. 中兴zxr10路由器重启命令_ZXR10路由器基本操作和配置.doc
  13. GEO数据库的使用(一)
  14. 基于bs架构的办公自动化系统毕业设计
  15. 100集华为HCIE安全培训视频教材整理 | Agile Controller终端安全管理特性(五)
  16. 论文精读:Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks
  17. 数据库原理课后答案 第六章
  18. idea的Annotate,可以在某个文件内部查看哪一行代码是谁提交的
  19. df和du显示的磁盘空间使用情况不一致的原因及处理
  20. 浅析防雷型TVS管的特性及应用

热门文章

  1. mysql控制结构_Mysql 控制结构初识
  2. Linux进程调度技术的前世今生
  3. 关于USB-Audio(USB麦克风)设备的录音验证
  4. FwmarkServer 实现以及功能分析
  5. CMOS摄像头驱动分析笔记1
  6. H264--H264解码--5
  7. error: unknown field ‘ioctl’ specified in initializer
  8. D - Maze(深度搜索+思维转换)
  9. python中的闭包与装饰器
  10. image 第二次使用就出错是怎么回事_第二次上机报告-RNA-seq (HISAT - SAMtools- StringTie - ballgown)amp;amp;Gene-Assembly