PRB: 创建 ASP.NET ASPCOMPAT 方式构造函数中的 STA 组件产生负面影响性能

文章翻译 文章翻译
文章编号: 308095 - 查看本文应用于的产品
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

症状

当您从 ASP.NET 页中 ASPCOMPAT 模式调用单元线程组件时, 您可能会注意到性能严重降低。

原因

如果您使用 ASPCOMPAT 模式 (也就是如果网页使用了 < @ ASPCOMPAT %%> ="true" 指令),ASP.NET 在一个 STA 线程池上运行这些网页。然而,在构造时创建的组件对象模型 (COM) 组件之前计划单线程单元 (STA) 线程池的请求创建,并因此创建从多线程的单元 (MTA) 线程。在这种情况下您出现性能下降。

最会的显著 (主机 STA) 在同一个线程执行单元线程组件从 MTA 线程创建的所有的实例。这意味着即使所有用户都有其自己的 COM 组件的实例的引用,所有这些组件到呼叫会序列化到这一个线程 (只有一个调用执行一次)。

此外,没有命中每次调用时对该组件从 事件由于线程交换机的一个较小的性能。这是因为在 STA 池中的线程上执行的 事件,但 COM 组件是仍在主机上执行 STA (因为从一个 MTA 客户端创建的 COM 组件)。此线程开关还会使用模拟的其他错误。有关详细的信息,请参阅本文的"参考"一节。

解决方案

如果您使用 ASPCOMPAT 模式与 STA 组件,只从一种方法或某一 事件 (例如对于 Page_LoadPage_Init 和等等),创建 COM 组件,并不在构造时创建这些 COM 组件。

例如对于避免成员的声明类似于以下在构造时创建的组件:

Visual.net Basic
<%@ Page Language="VB" ASPCOMPAT="TRUE" %>
<script runat="server">

Dim comObj As MyComObject = New MyComObject()

Public Sub Page_Load()
   comObj.DoSomething()
End Sub
</script>
				
visual C#.net
<%@ Page Language="C#" ASPCOMPAT="TRUE" %>
<script runat="server">

MyComObject comObj = new MyComObject();

public void Page_Load()
{
   comObj.DoSomething()
}
</script>
				
Visual J#.net
<%@ Page Language="VJ#" ASPCOMPAT="TRUE" %>
<script runat="server">

MyComObject comObj = new MyComObject();

public void Page_Load()
{
  comObj.DoSomething();
}
</script>
				
而是使用下面的代码:

Visual.net Basic
<%@ Page Language="VB" ASPCOMPAT="TRUE" %>
<script runat="server">

Dim comObj As MyComObject 

Public Sub Page_Load()
   comObj = New MyComObject()
   comObj.DoSomething()
End Sub
				
Visual C# .NET
<%@ Page Language="C#" ASPCOMPAT="TRUE" %>
<script runat="server">

MyComObject comObj;

public void Page_Load()
{
   comObj = new MyComObject();
   comObj.DoSomething();
}
				
Visual J# .NET
<%@ Page Language="VJ#" ASPCOMPAT="TRUE" %>
<script runat="server">

MyComObject comObj;

public void Page_Load()
{
  comObj = new MyComObject();
  comObj.DoSomething();
}
</script>
				

状态

此行为是设计使然。

参考

有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
325791PRB: 访问被拒绝在 ASP.NET 和电话 STA COM 组件进行模拟时,会出现错误消息

属性

文章编号: 308095 - 最后修改: 2014年2月24日 - 修订: 2.9
这篇文章中的信息适用于:
  • Microsoft ASP.NET 1.1
  • Microsoft Visual Basic .NET 2003 标准版
  • Microsoft Visual C# .NET 2003 标准版
  • Microsoft ASP.NET 1.0
  • Microsoft Visual .NET 2002 标准版
  • Microsoft Visual C# .NET 2002 标准版
  • Microsoft Visual J# .NET 2003 Standard Edition
  • Microsoft .NET Framework 1.1
关键字:?
kbnosurvey kbarchive kbmt kbhttpruntime kbinterop kbperformance kbprb kbreadme kbthread KB308095 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 308095
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com