默认情况下,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) COM 组件相关推荐

  1. Thread\Threading.Timer\Task中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”

    在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 出错环境: 1.在Thread线程中,调用Show ...

  2. 异常错误:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式

    最近做一个蛋疼的东西就是C#调用windows API 来操作一个摄像头,自动处理一些东西.要用到剪切板复制 粘贴功能,即 Clipboard.SetDataObject(filedic, true) ...

  3. 线程sta模式_C# 设置为单线程单元(STA)模式

    这个问题:在可以调用OLE之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的Main函数带有STAThreadAttribute标记然后网上搜的解决方法:ThreadnewThread;p ...

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

    在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 只有将调试器附加到该进程才会引发此异常. 程序之前 ...

  5. 什么是单线程单元(STA)什么是多线程单元(MTA)

    最近在解决问题的时候不得不使用线程,从而接触到了STA和MTA,度娘给的解释大多语焉不详.在WikiPedia上面看到了比较清楚的描述,趁着能访问的间隙麻利的摘抄下来分享和自我提升. 单元类型 描述 ...

  6. C#异常解决:在调用OLE之前,必须将当前线程设置为单线程单单元(STA)模式。

    问题来源: 昨晚上在调试数据库大作业的时候,我在注册界面Register里点击"上传头像"这个linklabel时,程序出现了一个异常:在调用OLE之前,必须将当前线程设置为单线程 ...

  7. 类中调用界面ActiveX控件报错当前线程不在单线程单元中因此无法实例化 ActiveX 控件的解决办法...

    解决办法是Form类中定义一个静态的ActiveX对象,在formload中将界面上的ActiveX对象赋值给新定义的对象,类中访问该静态对象即可. public static AxClientDri ...

  8. ASP.NET中对STA COM组件的不正确调用产生的w3wp远程DoS

    文章作者:debasis[AT]hackingspirits.com 译者注:本文是对06年一著名漏洞的漏洞分析,只因发现过程及漏洞产生机理极有价值,特翻译之,故没有注重其时效性,请各位包涵 :) 厂 ...

  9. 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a96“...

    在做采集时,有些网页因服务器限制用webclient或者webrequest不能获取html,这时我们可以用webbrowser的方法来绕过对方服务器的限制,但是在实例化webbrowser 的时候发 ...

最新文章

  1. UNIX编程笔记:关于停止的进程接收信号的问题
  2. 敏捷软件开发实践——估算与计划(01)
  3. 详解SQL中的触发器
  4. python实训收获_英泰移动通信:学习Python心得体会
  5. 洛谷P1474 [USACO 2.3]货币系统 Money Systems [2017年4月计划 动态规划04]
  6. stackoverflow上Java相关回答整理翻译FAQ top 100
  7. hdu 4501 小明系列故事——买年货 多重背包
  8. 数据备份_这5种数据备份方式你全都了解吗?
  9. Kubernates和Docker
  10. 第10章 文档对象模型DOM 10.2 Document类型
  11. ZBrush for Mac的插图技巧
  12. EditText有焦点(focusable为true)阻止输入法弹出
  13. 指派问题程序c语言,指派问题lingo程序样例
  14. 轻量级web api_API接口管理,这15种开源工具助你管理API
  15. 云南大学计算机在职硕士,在职硕士
  16. 疯狂脑机接口计划:马斯克的 “读心术”
  17. linux系统中查看防火墙开放端口号命令
  18. MGTools 一款专业级键鼠性能测试工具
  19. Centos7下SVN服务端搭建以及hook应用
  20. artemis服务_Artemis安装

热门文章

  1. catv系统主要有哪三部分组成_你了解买车“三大件”之一的悬挂系统吗?家用车用什么悬挂系统?...
  2. 深蓝学院的深度学习理论与实践课程:第三章
  3. 机器学习中的数学基础:(1)实际应用中矩阵特征值与特征向量的几何意义
  4. 4行Python代码生成图像验证码
  5. AI视频行为分析系统项目复盘——技术篇2:视频流GPU硬解码
  6. php ob_flush无效,php ob_flush,flush在ie中缓冲无效的解决方法
  7. cf两边黑屏怎么解决win10_Win10电脑开机黑屏只有鼠标指针无法进入桌面的解决方法...
  8. STL nth_element
  9. Angular使用@Input和@Output实现父子组件互相传参(类似Vue的props和this.emit)
  10. linux 查看库的安装信息