2011-03-06 117 views
3

在我的aspx页面中,我调用了一个使用STA的COM组件。所以我使用aspcompat = true参数,但我想了解逻辑。它究竟做了什么?据我所知,在STA中,假设只被一个线程调用。所以我应该自己提供线程安全。ASPX中的Aspcompat页面

如果这是正确的,那么aspcompat参数提供线程安全性?在整个页面上,还是我访问STA组件的地方?

+0

你得到最终的解决方案?没有标记的答案 – Kiquenet 2016-11-02 07:05:46

回答

1

该指令导致ASP.NET提供对ASP内部对象的访问并将线程池更改为MTA。

详情签this

1

这是取自报价; Pro .NET Performance

AsP.nET在默认情况下在MTA线程上执行页面。如果你打电话给sTA 对象,他们会进行编组。如果您主要致电sTA 对象,则会降低性能。您可以通过标记 页面与ASPCOMPAT属性解决这个问题,具体如下:

<%@Page Language = "vb" AspCompat = "true" %> 

注意页面的构造函数仍然执行MTA线程,所以推迟 创建STA对象到的Page_Load和Page_Init事件。

1

当使用单线程单元(STA)COM组件,如 组件使用Visual Basic开发,从一个ASP.NET页面,您 必须包括兼容性属性AspCompat =真

<%@ Page> 

标签ASP.NET页面

的AspCompat属性强制页在STA模式下执行

ASP.NET默认使用MTA(多线程单元)线程

当构建ASP.NET应用程序接口与老同学COM 对象,如那些使用VB6或Visual FoxPro(MTDLL)创建的,它是 非常重要的是提供请求的线程使用 单线程公寓线程。 STA是一种COM内置技术 ,它允许基本单线程组件在多线程环境中可靠地运行 。 STA保证在特定线程上实例化的COM对象 停留在该特定线程上,并且任何从另一个线程访问COM对象的自动将该线程自动编组到该STA线程。最终的效果是,您可以拥有多个线程,但COM对象实例位于固定的永不改变的线程上。

ASP.NET在默认情况下使用MTA(多线程单元)线程,其中 是真正自由旋转的线程,不考虑COM对象 编组。这比STA线程有效得多,因为STA线程在确定是否可以在给定线程上运行 上的代码或者是否需要某种类型的线程/ COM编组发生 有点额外开销。 MTA COM组件可能非常有效,但多线程环境中的组件总是倾向于具有公平的开销量。

STA在ASP.NET

支持STA在ASP.NET框架线程是相当有限的。 特别地,只有原始的ASP.NET WebForms技术支持 直接通过STA页面处理程序实现的STA线程,或者您可能知道的ASPCOMPAT模式的 。对于运行STA部件的WebForms 是如在@Page标签指定ASPCOMPAT属性一样容易:

<%@ Page Language="C#" AspCompat="true" %> 

运行在STA模式的页面。删除它在MTA模式下运行。简单。

STA对于非支持ASP.NET技术

唯一的WebForms支持STA本身

  • ASP.NET HttpHandlers的
  • ASMX Web服务
  • ASP。 NET MVC
  • WCF Web服务
  • 的ASP.NET Web API

STA组件是一个痛苦的屁股。我觉得你的痛苦:-)

很好的参考:

https://weblog.west-wind.com/posts/2012/Sep/18/Creating-STA-COM-compatible-ASPNET-Applications#STAfornonsupportingASP.NETTechnologies