在我的aspx页面中,我调用了一个使用STA的COM组件。所以我使用aspcompat = true参数,但我想了解逻辑。它到底是做什么的?据我所知,在STA中,假设仅由一个线程调用。所以我应该自己提供线程安全。
如果这是正确的,aspcompat参数在哪里提供线程安全?在整个页面上,还是我访问STA组件的位置?
答案 0 :(得分:1)
该指令使ASP.NET提供对ASP内部对象的访问,并将线程池更改为MTA。
有关详细信息,请结帐this
答案 1 :(得分:1)
这是引自; Pro .NET Performance
默认情况下,AsP.nET在MTA线程上执行页面。如果你打电话给sTA 对象,他们进行编组。如果你主要打电话给sTA 对象,这会降低性能。你可以通过标记来解决这个问题 具有ASPCOMPAT属性的页面,如下所示:
<%@Page Language = "vb" AspCompat = "true" %>
请注意,页面构造函数仍然在MTA线程中执行,因此推迟 为Page_Load和Page_Init事件创建sTA对象。
答案 2 :(得分:1)
使用单线程单元(STA)COM组件时,如 使用Visual Basic开发的组件,来自ASP.NET页面 必须在
中包含兼容性属性 AspCompat = true
<%@ Page>
ASP.NET页面上的标签
AspCompat属性强制页面在STA模式下执行
ASP.NET默认使用MTA(多线程单元公寓)线程
构建与旧学校COM接口的ASP.NET应用程序时 用VB6或Visual FoxPro(MTDLL)创建的对象就是这样的 服务请求的线程使用非常重要 单线程公寓线程。 STA是COM内置技术 这使得基本上单线程组件可以可靠地运行 在多线程环境中。 STA保证COM对象 在特定线程上实例化保留在该特定线程和任何线程上 从另一个线程访问COM对象会自动封送它 线程到STA线程。最终效果是你可以有多个 线程,但COM对象实例生活在一个永不改变的固定上 线。
ASP.NET默认使用MTA(多线程单元)线程 是真正自由旋转的线程,不关注COM对象 封送处理。这比STA线程有效得多 在确定是否可以在a上运行代码时需要一些开销 给定线程或是否需要某种线程/ COM编组 发生。 MTA COM组件可以非常高效,但是STA COM 多线程环境中的组件总是趋于公平 开销量。
ASP.NET中的STA
ASP.NET框架中对STA线程的支持相当有限。 特别是只有原始的ASP.NET WebForms技术支持 STA直接通过其STA Page Handler实现进行线程处理 你可能知道ASPCOMPAT模式。对于运行STA组件的WebForms 就像在@Page标签中指定ASPCOMPAT属性一样简单:
<%@ Page Language="C#" AspCompat="true" %>
以STA模式运行页面。删除它在MTA模式下运行。简单。
用于非支持ASP.NET技术的STA
只有WebForms本身支持STA
好参考: