在我的 aspx 页面中,我调用了一个使用 STA 的 COM 组件。所以我使用 aspcompat=true 参数,但我想了解逻辑。它究竟是做什么的?据我所知,在 STA 中,假设它只被一个线程调用。所以我应该自己提供线程安全。
如果这是正确的,aspcompat 参数在哪里提供线程安全?在整个页面上,还是仅在我访问 STA 组件的地方?
从 ASP.NET 页面使用单线程单元 (STA) COM 组件(例如使用 Visual Basic 开发的组件)时,您必须将兼容性属性AspCompat=true包含在
<%@ Page>
ASP.NET 页面上的标记
AspCompat 属性强制页面以 STA 模式执行
ASP.NET 默认使用 MTA(多线程单元)线程
在构建与老式 COM 对象(例如使用 VB6 或 Visual FoxPro (MTDLL) 创建的对象)交互的 ASP.NET 应用程序时,服务请求的线程使用单线程单元线程非常重要。STA 是一种 COM 内置技术,它允许基本上单线程组件在多线程环境中可靠地运行。STA 保证在特定线程上实例化的 COM 对象保留在该特定线程上,并且从另一个线程对 COM 对象的任何访问都会自动将该线程编组到 STA 线程。最终效果是您可以拥有多个线程,但 COM 对象实例存在于固定的永不更改的线程上。
默认情况下,ASP.NET 使用 MTA(多线程单元)线程,这些线程是真正自由的旋转线程,不理会 COM 对象封送处理。这比 STA 线程要高效得多,STA 线程在确定是否可以在给定线程上运行代码或是否需要进行某种线程/COM 编组时会产生一些开销。MTA COM 组件可能非常高效,但多线程环境中的 STA COM 组件往往会产生相当大的开销。
ASP.NET 中的 STA
ASP.NET 框架中对 STA 线程的支持相当有限。具体来说,只有原始的 ASP.NET WebForms 技术直接通过其 STA 页面处理程序实现或您可能知道的 ASPCOMPAT 模式支持 STA 线程。对于运行 STA 组件的 WebForms,只需在 @Page 标记中指定 ASPCOMPAT 属性即可:
<%@ Page Language="C#" AspCompat="true" %>
它以 STA 模式运行页面。删除它在 MTA 模式下运行。简单的。
用于不支持 ASP.NET 技术的 STA
只有 WebForms 原生支持 STA
STA 组件很麻烦。我感觉到你的痛苦:-)
很好的参考:
该指令使 ASP.NET 提供对 ASP 固有对象的访问并将线程池更改为 MTA。
有关更多详细信息,请查看此
这是引自;Pro .NET 性能
默认情况下,AsP.nET 在 MTA 线程上执行页面。如果您调用 sTA 对象,它们会进行封送处理。如果您主要调用 sTA 对象,这将降低性能。您可以通过使用 ASPCOMPAT 属性标记页面来解决此问题,如下所示:
<%@Page Language = "vb" AspCompat = "true" %>
请注意,页面构造函数仍然在 MTA 线程中执行,因此将创建 sTA 对象推迟到 Page_Load 和 Page_Init 事件。