避免单线程单元 (STA) COM 组件
默认情况下,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="C#" 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="C#" 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 组件的可能性,或者更好的办法是迁移代码以使对象成为托管对象。
最新文章
- ThinkPHP3.2.3多文件上传,文件丢失问题的解决
- kali 安装ss代理客户端的方法(纯属个人总结)
- HTML实践发现(标签<;pre>;)
- android基于GPS实现定位操作
- 分享一个批量导出当前实例下的所有linkedserver脚本
- 内省(Introspector)
- java中的自增问题
- 【avalon】createMap
- rpm包的管理
- UVALive 5983 MAGRID
- 基于用户映射的CAS单点登录系统设计与实现
- android adb 常用指令
- ARC下需要注意的内存管理
- 关于div+css布局值得注意的地方
- 【Spark2.0源码学习】-10.Task执行与回馈
- [日常] NOIP前集训日记
- 发布Ext JS 5.1 beta版本
- Python 模型定义 :通过pymysql和数据模型(models.py)创建mysql表及表结构
- Django之WSGI 和MVC/MTV
- CAP与Base理论
热门文章
- 【Codeforces Round #301 (Div. 2) A】 Combination Lock
- GDB中创建要素数据集
- hdu2049(组合数学)
- WPF学习笔记——概述
- UVA 11461 - Square Numbers 数学水题
- Snail—UI学习之自己定义标签栏UITabBarController
- HDU 1800 Flying to the Mars Trie或者hash
- Android学习笔记(20):时钟(AnalogClock和TextClock)和计时器(Chronometer)
- Hadoop1.2.1伪分布模式安装指南 分类: A1_HADOOP 2014-08-17 10:52 1346人阅读 评论(0) 收藏
- Qt多线程学习-用例子来理解多线程(转),这个是我看过最好的文章,总结很详细(感觉exec()的作用就是保持线程不退出,这样方便随时处理主线程发来的信号,是一种非常别致的思路)good