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

原创 2004年10月25日 00:24:00
 默认情况下,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 组件的可能性,或者更好的办法是迁移代码以使对象成为托管对象。

版权声明:本文为博主原创文章,未经博主允许不得转载。

当前线程不在单线程单元中,因此无法实例化 ActiveX 控件解决办法

(一)引经据典(MSDN):1.单元是进程内部具有相同线程访问要求的对象的逻辑容器。同一单元中的所有对象都可以接收从该单元中的任何线程发出的调用。.NET Framework 不使用单元,托管对象自己...
  • xuehuic
  • xuehuic
  • 2011年05月17日 10:36
  • 21350

C#错误——“当前线程不再单线程单元中”

C#错误——“当前线程不再单线程单元中” 因为毕业设计需要使用MapObjects2组件。开始使用时正常,但是是不是就发生了问题,不知道怎么解决,因为马上要答辩了,不能在答辩的时候不能出现问题。在网上...
  • AloneSword
  • AloneSword
  • 2006年06月11日 01:20
  • 1817

在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式

在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式 转载自:http://blog.163.com/smhily_min/blog/static/7520622620109201...
  • xuehuic
  • xuehuic
  • 2012年02月03日 15:21
  • 5964

遇到的问题-----------c#在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式

今天在一个复杂的项目中添加一个弹出新窗口点击按钮后选择文件读取文件的功能。 代码如下: 在同一个命名空间Api中: Txt.cs class Txt { ...
  • q383965374
  • q383965374
  • 2013年10月28日 16:03
  • 4987

其他信息:在可以调用OLE之前,必须将当前线程设置为单线程单元(STA)模式

其他信息:在可以调用OLE之前,必须将当前线程设置为单线程单元(STA)模式 ,C#编写dll时遇到的问题!...
  • gx_489587482
  • gx_489587482
  • 2016年11月11日 21:15
  • 1411

STA 进程内Com组件剖析

1. 我们知道对单线程套间内Com对象的跨套间访问需要通过
  • xbgprogrammer
  • xbgprogrammer
  • 2016年08月07日 20:34
  • 768

在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记。

出错环境: 多线程接收文件的时候,需要打开一个SaveFileDialog对象,并调用ShowDialog()方法 出错代码: [html] view plaincopy ...
  • zhangxtn
  • zhangxtn
  • 2014年05月05日 15:21
  • 1940

【Windows8开发】异步编程进阶篇之 单线程套间(STA)及如何控制task执行上下文

(请大家注意了,本文涉及的概念相当重要,开发中相当管用) 开始就先来看一段代码: void SampleCpp::MainPage::Btn_Click(Platform::Object^ sen...
  • my_business
  • my_business
  • 2012年09月19日 22:58
  • 4340

COM线程模型 - COM服务端(STA组件)创建线程

当我们在COM组件内部创建线程的时候,又是怎么样的一种情况呢? 这里,我们需要分...
  • zj510
  • zj510
  • 2014年09月15日 11:54
  • 995

C#“必须先将当前线程设置为单个线程单元(STA)模式方可进行OLE调用”异常解决方案

异常信息: 必须先将当前线程设置为单个线程单元(STA)模式方可进行 OLE 调用。 说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误...
  • fromfire2
  • fromfire2
  • 2017年10月11日 17:04
  • 232
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:避免单线程单元 (STA) COM 组件
举报原因:
原因补充:

(最多只允许输入30个字)