`

避免单线程单元 (STA) COM 组件

阅读更多
 默认情况下,ASP.NET 不允许任何 STA COM 组件在页面内运行。若要运行它们,必须在 .aspx 文件内将 ASPCompat=true 属性包含在 @ Page 指令中。这样就将执行用的线程池切换到 STA 线程池,而且使 HttpContext 和其他内置对象可用于 COM 对象。前者也是一种性能优化,因为它避免了将多线程单元 (MTA) 封送到 STA 线程的任何调用。
  使用 STA COM 组件可能大大损害性能,应尽量避免。若必须使用 STA COM 组件,如在任何 interop 方案中,则应在执行期间进行大量调用并在每次调用期间发送尽可能多的信息。另外,小心不要在构造页面期间创建任何 STA COM 组件。例如下面的代码中,在页面构造时将实例化由某个线程创建的 MySTAComponent,而该线程并不是将运行页面的 STA 线程。这可能对性能有不利影响,因为要构造页面就必须完成 MTA 和 STA 线程之间的封送处理。

<%@ Page Language="VB" ASPCompat="true" %>
<script runat=server>
Dim myComp as new MySTAComponent()
Public Sub Page_Load()
myComp.Name = "Bob"
End Sub
</script>
<html>
<%
Response.Write(myComp.SayHello)
%>
</html>

  首选机制是推迟对象的创建,直到以后在 STA 线程下执行上述代码,如下面的例子所示。

<%@ Page Language="VB" ASPCompat="true" %>
<script runat=server>
Dim myComp
Public Sub Page_Load()
myComp = new MySTAComponent()
myComp.Name = "Bob"
End Sub
</script>
<html>
<%
Response.Write(myComp.SayHello)
%>
</html>

  推荐的做法是在需要时或者在 Page_Load 方法中构造任何 COM 组件和外部资源。

  永远不要将任何 STA COM 组件存储在可以由构造它的线程以外的其他线程访问的共享资源里。这类资源包括像缓存和会话状态这样的资源。即使 STA 线程调用 STA COM 组件,也只有构造此 STA COM 组件的线程能够实际为该调用服务,而这要求封送处理对创建者线程的调用。此封送处理可能产生重大的性能损失和可伸缩性问题。在这种情况下,请研究一下使 COM 组件成为 MTA COM 组件的可能性,或者更好的办法是迁移代码以使对象成为托管对象。

分享到:
评论

相关推荐

    STA组件简单调用(MTA客户,STA客户)

    STA(单线程公寓)是COM线程模型的一种,它规定一个线程只能拥有一个STA组件实例。在这种模型下,所有接口调用都必须在一个线程中串行执行,确保了线程安全。STA常用于UI线程,因为UI控件通常需要在创建它们的线程中...

    【源码】[疑难]在单线程中模拟多线程的工作模式

    然而,在某些情况下,例如使用COM组件(如ActiveX控件),我们可能需要在单线程应用程序中实现线程安全的多任务处理,这就需要用到单线程公寓(Single Threaded Apartment, STA)模型。 描述中提到的“把单线程中的...

    COM多线程访问演示

    在多线程环境中,COM提供了不同的线程访问策略,主要包括单线程公寓(STA, Single Threaded Apartment)和多线程公寓(MTA, Multi Threaded Apartment)。本示例“COM多线程访问演示”旨在帮助开发者理解并掌握如何...

    COM线程模型解析COM套间

    本文将深入探讨COM线程模型中的核心概念:STA(Single Threaded Apartment,单线程公寓)、MTA(Multi Threaded Apartment,多线程公寓)以及它们之间的交互。 首先,我们要知道COM线程模型是为了解决线程安全性和...

    开发com组件 潘爱民

    6. **线程模型**:COM组件支持多种线程模型,如单线程非 apartments(STA)、多线程 apartments(MTA)和自由线程 marshaling(FTM)。选择合适的线程模型对组件性能和兼容性至关重要。 7. **自动化(Automation)*...

    线程介绍(三)

    单元模式分为两种类型:单线程单元(STA,Single Threaded Apartment)和多线程单元(MTA,Multi Threaded Apartment)。 1. 单线程单元和Windows Forms 单线程单元是专门为Windows Forms设计的,因为许多Windows ...

    保存的Com组件操作

    - 单线程公寓(STA):组件在一个线程上下文中运行,适合GUI组件。 - 多线程公寓(MTA):组件可以在多个线程上下文中运行,适合服务器组件。 8. **延迟加载和缓存**: - 动态加载可以提高程序启动速度,只有在...

    COM线程+COM线程实例

    1. 单线程 apartment(STA):在这种模型中,每个COM对象都在一个单独的线程中运行,且所有对该对象的调用都必须在同一线程内进行。这通常用于用户界面组件,因为UI更新需要线程同步以避免数据竞争。 2. 多线程 ...

    vc.rar_VC++调用C_vc COM_vc call ocx_调用COM_调用com组件

    6. **COM线程模型**:COM组件可以有单线程公寓(STA)或多线程公寓(MTA)的线程模型。VC++应用必须根据组件的线程模型进行相应的线程管理,以避免线程冲突。 7. **异常处理**:在调用COM方法时,应使用`try-except...

    asp组件开发指南

    然而,某些组件可能需要特定的线程模型,例如单线程公寓(STA)或多线程公寓(MTA)。选择合适的线程模型可以优化性能,避免线程冲突,并确保组件的正确运行。 3. **ASP组件与COM+服务** COM+是COM的一个扩展,...

    CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88

    COM上下文是COM组件中线程模型的一部分,特别是对于单线程单元(Single Threaded Apartment, STA)。STA是一种线程模型,其中每个线程只能拥有一个COM对象的实例,并且必须在同一个线程中调用该对象的方法。在STA中...

    一个多线程的COM程序

    有两种主要的公寓模型:单线程公寓(STA,Single Threaded Apartment)和多线程公寓(MTA,Multi-Threaded Apartment)。 4. **单线程公寓(STA)** STA中,所有COM对象都在同一个线程中运行,确保了对象访问的...

    COM+组件服务技术内幕

    3. **线程模型**:COM组件可以有不同的线程模型,如单线程 Apartment(STA)、多线程 Apartment(MTA)和自由线程 Marshaling(Apartment)。选择合适的线程模型对于组件的并发性能和兼容性至关重要。 4. **事件...

    COM技术内幕源码.rar

    6. **线程模型(Thread Marshalling)**:COM组件支持不同的线程模型,如单线程非 apartments(STA)、多线程非apartments(MTA)和多线程 apartments(MTA)。这决定了组件如何处理跨线程的调用。 7. **晚绑定...

    C# COM+ Programming

    - 考虑组件的线程模型,例如单线程单元(STA)或多线程单元(MTA),根据应用需求选择。 9. **调试与测试**: - 使用Visual Studio的COM+应用程序调试功能,或通过COM+事件查看器监控组件行为。 - 使用COM+测试...

    潘爱民COM讲义.rar

    线程模型定义了组件如何处理来自不同线程的请求,包括单线程 Apartment(STA)、多线程 Apartment(MTA)和自由线程 Marshaling(Free)。选择正确的线程模型对于确保组件的线程安全和性能至关重要。 此外,COM还...

    atl开发技术深入解析_part3

    例如,在设计多线程安全的组件时,选择合适的线程模型(STA或MTA),并通过注册表明确指定`ThreadingModel`,能有效避免线程同步问题,提高组件的稳定性和响应速度。此外,熟悉`CoInitializeEx`函数的使用,确保...

    C++中COM组件初始化方法实例分析

    1. **线程安全性**:COM组件可以工作在两种线程模型下——单线程公寓(STA)和多线程公寓(MTA)。不同的线程模型有不同的并发行为,选择哪种模型取决于你的组件和服务的要求。 2. **延迟初始化**:并非所有应用...

    delphi中提示“尚未调用coinitialize错误”的解决方法.pdf

    CoInitialize是早期版本的COM库初始化函数,它以NULL参数调用,设置线程协同模式为单线程公寓模型(STA,Single Threaded Apartment)。在单线程公寓模型中,一个线程只能拥有一个线程公寓中的对象。对于大多数用户...

Global site tag (gtag.js) - Google Analytics