OLE及.net的线程模型

来源:互联网 发布:程序员在北京能挣多少 编辑:程序博客网 时间:2024/05/18 01:03
OLE 线程模型的说明和工作方式
     COM 对象可以用于一个进程的多线程。“单线程单元” (STA) 和“多线程单元” (MTA) 术语用于为描述对象与线程间
的关系、对象间的并行关系、使用何种方 法将调用传递给对象的方式以及在线程间传递接口指针的规则而建立的概念
框架。组件及其客户可以在 COM 目前支持的以下两个单元模型之间进行选择: 
1、单线程单元模型 (STA):进程中一个或多个线程使用 COM ,并且 COM 对象的调用由 COM 进行同步。在线程间对接
口进行编组。单线程单元模型的退化情况(其 中,在给定的进程中只有一个线程使用 COM)被称为单线程模型。以前
的 Microsoft 信息与文档曾经将 STA 模型简单地称为“单元模型”。
2、多线程单元模型 (MTA):一个或多个线程使用 COM,并且由所有与 MTA 有关的线程直接调用与 MTA 有关的 COM 对
象/,而在调用者和对象间没有系统代码的插入 。由于多个同步客户可能将或多或少地同时调用对象(同时在多个处理
器系统上),所以对象必须自己同步其内部状态。在线程间没有接口编组。以前的  Microsoft 信息与文档曾经将此模
型称为“自由线程模型”。
3、STA 模型和 MTA 模型均可以用于同一进程。 有时这种模型被称为“混合模型”的进程。
http://support.microsoft.com/kb/150777/zh-cn
·
.net的线程模型
    .NET Framework 不使用单元,托管对象自己负责以线程安全的方式使用所有共享资源。
应用问题:
   如果在单元线程中调用COM组件将抛出错误:- 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件  
   由于 COM 类使用单元,因此公共语言运行库需要在 COM interop 的情况下调用 COM 对象时创建并初始化一个单元。托管线程可以创建并进入只允许有一个线程的单线程单元 (STA) 或者包含一个或多个线程的多线程单元 (MTA)。
   * 给定线程只能初始化 COM 单元一次,因此在第一次调用非托管代码之后就不能更改单元类型。
设置线程模型单元类型的方法。
    1,设置线程 ApartmentState 属性为 ApartmentState 枚举值。
 如:Thread.SetApartmentState(ApartmentState.STA);
    2,在CUI/GUI程序中,入口方法上指定[STAThread]/[MTAThread]特性设置单元类型
         在aspx页面上可以使用AspCompat = "true" 来达到同样的效果。
         这个属性只在  Com  Interop  有用,如果全部是  managed  code  则无用。
·
附:InvalidOperationException--线程间操作无效: 从不是创建控件“...”的线程访问它
原因:
    Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件,.NET Framework 中控件属性CheckForIllegalCrossThreadCalls用来设置是否线程安全方式访问控件,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,此异常在调试期间和运行时的某些情况下可靠地发生。
解决方法:
  
  1,将 CheckForIllegalCrossThreadCalls 属性的值设置为 false 来禁用此异常。(不建议)
  2,使用委托
   
原创粉丝点击