最近学习COM(+),由于是新手、自学且没有什么开发经验,遇到了不少问题。下面列出了5个理论上的疑惑,我思前想后,理解不力啊。也许我提的问题本身也有问题,不过还是烦请各位高手帮忙看看,参与讨论并给出你的见解。支持有分,本周日结帖,谢谢!!!每一个COM+对象在外围具有三道边界:进程、套间和环境。当进行跨边界(包括跨进程、同一进程中跨套间和同一套间中跨环境)调用时,调用者和被调用者的对象之间必须加入代理机制,只有处于同一环境中的对象才能进行直接调用。COM+定义了三种对象可以驻留的套间:
①单线程套间(Single-threaded Apartment,STA)
②多线程套间(Multi-threaded Apartment,MTA)
③标准线程套间(Thread-neutral Apartment,TNA)1、在COM+中,只有基于DLL的服务器才能使用COM+的服务。组件可被配置为属于①库应用程序(与客户运行在同一个地址空间)或②服务应用程序(运行在一个独立的地址空间中)。如果所请求的组件属于一个服务应用程序,则当客户激发对象时,SCM(Service Control Manager,服务控制管理器)创建一个代理进程(称作DllHost.exe)并装载组件进这个代理进程。
【疑惑1】如果一个基于DLL的COM组件被配置为COM+服务应用程序,那么这个组件就属于进程外组件了吗?如果是,那组件属于进程内还是属于进程外不再以DLL或EXE为判别标准了吗?此为一基本疑惑,理清它对理解下面几个问题有助。2、由于不同的进程使用不同的地址空间,所以客户不能直接调用进程外组件(包括本地进程外组件和远程组件)。对于跨进程调用,中间必须经过代理/存根(Proxy/Stub)机制和使用列集/散集(Marshaling/Unmarshaling)手段。对于进程外组件对象,客户必须跨进程边界,因此调用始终是间接进行的,中间必须经过调度,而这种调度自动实现了对调用的串行化访问,对象成员函数可以不处理同步。
【疑惑2】照这么说,一个进程外组件,不管其线程模型是什么(哪怕是MTA),都不用手动编码处理同步了吗?好像很矛盾啊。3、套间是线程模型的基本单元,而环境则是列集机制的基本边界。虽然跨套间的调用必须经过代理和存根代码,但是这并不意味着需要经过线程切换,这是环境与套间的重要区别。在跨套间调用过程中,影响性能的主要因素在于线程切换,而不是参数列集和散集处理。
【疑惑3】线程切换很耗性能吗?为什么?4、运行于STA中的组件对象不需要进行同步处理,但对它只能进行串行化访问;而运行于MTA中的组件对象可以并行访问,但组件自身必须保证是线程安全的。我们很难在追求效能和简化程序设计这两者之间保持平衡。COM+引入的TNA和同步域可以很好地解决这个问题,我们可以声明组件的线程模型为TNA,这样的组件对象既可以通过编码保证自身的线程安全性,也可以通过申明同步域属性由COM+自动提供同步保护;另一方面TNA中的对象可被同一进程中的任何线程直接调用,无需线程切换。
【疑惑4】照这么说,STA组件改TNA组件,只要在接口中将属性Apartment改成Neutral就成了,不需要手工编码处理同步,因为可以在COM+中配置同步支持为需要(Required)(注:这样的设置常被称为租借线程(rental-threading)模型)由COM+自动提供同步保护,是这样的吗?如果是,那TNA组件相比STA组件在性能上有什么提升呢?难道是来自同一进程的STA或MTA对TNA的调用不用线程切换,就此而已吗?那如果是来自进程外的客户对TNA的调用还是有线程切换的啊。5、大多COM组件要求在STA中执行,而ASP.Net页面默认情况下运行在MTA中。为了保证和COM组件(包括COM+)的线程模型兼容,ASP.Net经过配置可以运行在STA中。只要在页面的<@ Page />中加一个属性ascompat并将值设为true,ASP.NET就会让页面运行在STA中。这个选项会导致一定的性能损失,但应该可以解决多数COM组件调用问题。
【疑惑5】ASP.Net页面运行在哪个进程内?与IIS的设置有关吗?如果不设置aspcompat属性为true,那调用TNA组件会不会有问题?
①单线程套间(Single-threaded Apartment,STA)
②多线程套间(Multi-threaded Apartment,MTA)
③标准线程套间(Thread-neutral Apartment,TNA)1、在COM+中,只有基于DLL的服务器才能使用COM+的服务。组件可被配置为属于①库应用程序(与客户运行在同一个地址空间)或②服务应用程序(运行在一个独立的地址空间中)。如果所请求的组件属于一个服务应用程序,则当客户激发对象时,SCM(Service Control Manager,服务控制管理器)创建一个代理进程(称作DllHost.exe)并装载组件进这个代理进程。
【疑惑1】如果一个基于DLL的COM组件被配置为COM+服务应用程序,那么这个组件就属于进程外组件了吗?如果是,那组件属于进程内还是属于进程外不再以DLL或EXE为判别标准了吗?此为一基本疑惑,理清它对理解下面几个问题有助。2、由于不同的进程使用不同的地址空间,所以客户不能直接调用进程外组件(包括本地进程外组件和远程组件)。对于跨进程调用,中间必须经过代理/存根(Proxy/Stub)机制和使用列集/散集(Marshaling/Unmarshaling)手段。对于进程外组件对象,客户必须跨进程边界,因此调用始终是间接进行的,中间必须经过调度,而这种调度自动实现了对调用的串行化访问,对象成员函数可以不处理同步。
【疑惑2】照这么说,一个进程外组件,不管其线程模型是什么(哪怕是MTA),都不用手动编码处理同步了吗?好像很矛盾啊。3、套间是线程模型的基本单元,而环境则是列集机制的基本边界。虽然跨套间的调用必须经过代理和存根代码,但是这并不意味着需要经过线程切换,这是环境与套间的重要区别。在跨套间调用过程中,影响性能的主要因素在于线程切换,而不是参数列集和散集处理。
【疑惑3】线程切换很耗性能吗?为什么?4、运行于STA中的组件对象不需要进行同步处理,但对它只能进行串行化访问;而运行于MTA中的组件对象可以并行访问,但组件自身必须保证是线程安全的。我们很难在追求效能和简化程序设计这两者之间保持平衡。COM+引入的TNA和同步域可以很好地解决这个问题,我们可以声明组件的线程模型为TNA,这样的组件对象既可以通过编码保证自身的线程安全性,也可以通过申明同步域属性由COM+自动提供同步保护;另一方面TNA中的对象可被同一进程中的任何线程直接调用,无需线程切换。
【疑惑4】照这么说,STA组件改TNA组件,只要在接口中将属性Apartment改成Neutral就成了,不需要手工编码处理同步,因为可以在COM+中配置同步支持为需要(Required)(注:这样的设置常被称为租借线程(rental-threading)模型)由COM+自动提供同步保护,是这样的吗?如果是,那TNA组件相比STA组件在性能上有什么提升呢?难道是来自同一进程的STA或MTA对TNA的调用不用线程切换,就此而已吗?那如果是来自进程外的客户对TNA的调用还是有线程切换的啊。5、大多COM组件要求在STA中执行,而ASP.Net页面默认情况下运行在MTA中。为了保证和COM组件(包括COM+)的线程模型兼容,ASP.Net经过配置可以运行在STA中。只要在页面的<@ Page />中加一个属性ascompat并将值设为true,ASP.NET就会让页面运行在STA中。这个选项会导致一定的性能损失,但应该可以解决多数COM组件调用问题。
【疑惑5】ASP.Net页面运行在哪个进程内?与IIS的设置有关吗?如果不设置aspcompat属性为true,那调用TNA组件会不会有问题?
解决方案 »
- 要找房子,请问各位朋友,北京哪里有环境和交通比较方便的大型公寓?
- form , Frame
- 公式解释器
- 看了扫雷的程序,大概可以明白它的原理, 但不知道下面的数据他是怎么弄来的
- 请问advStringGrid怎样做到,点击某一列的标题后自动根据此列排序??
- 100分!哪里有免费的fast report(非试用版)?非常感谢!
- 设计期控制预览里纸张的大小?!
- 请问public和private,protected中的问题
- 如何修改RichEdit控件某一行的背景颜色
- 后台为SQL SERVER2000所出现的问题?着急的要命?救救我吧!!!!!!!!!!
- 请问注册表单元的savekey怎么用?如何取得注册表里所有键值?online wait
- 帮忙
对于代理进程(称作DllHost.exe)而言,dll的com+组件是进程内组件,客户端调用的是代理进程(称作DllHost.exe)接口中的东东,然后代理进程(称作DllHost.exe)直接或间接调用dll的com+组件。
说得不对莫怪!
“【疑惑2】之个人看法:
客户调用一个进程外组件(假设其线程模型为 MTA),这个时候 Stub 会建立在该进程外组件的 MTA 中”
和客户端初始化COM库的方式有关否?
多个客户就对应有多个 Stub(这些 Stub 会建立在从 COM 线程池中取出的多个线程中),而此进程外MTA组件只有一个,被这些Stub同时访问。
那么STA组件呢,是不是多个客户对应有多个Stub,而每一个Stub各自对应一个STA组件?还是和MTA一样呢?恭请leapmars(流铭)兄大驾!