Microsoft KB Archive/308095

From BetaArchive Wiki
Knowledge Base


PRB: Creating STA Components in the Constructor in ASP.NET ASPCOMPAT Mode Negatively Affects Performance

Article ID: 308095

Article Last Modified on 2/23/2007



APPLIES TO

  • Microsoft ASP.NET 1.1
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual J# .NET 2003 Standard Edition
  • Microsoft .NET Framework 1.1



This article was previously published under Q308095

SYMPTOMS

When you call apartment-threaded components from an ASP.NET page in ASPCOMPAT mode, you may notice severe performance degradation.

CAUSE

If you use ASPCOMPAT mode (that is, if you use a page with the <%@ ASPCOMPAT="true" %> directive), ASP.NET runs those pages on an STA thread pool. However, Component Object Model (COM) components that are created at construction time are created before the request is scheduled to the single-threaded apartment (STA) thread pool and are therefore created from a multithreaded apartment (MTA) thread. In this scenario, you experience substantial performance degradation.

Most significantly, the same thread (host STA) executes all instances of apartment-threaded components that are created from MTA threads. This means that even though all users have a reference to their own instance of the COM component, all of the calls into these components are serialized to this one thread (only one call executes at a time).

Additionally, there is a smaller performance hit each time a call is made to the component from the Page events because of a thread switch. This is because the Page events are executed on a thread from the STA pool, but the COM component is still executed on the host STA (because the COM component was created from an MTA client). This thread switch also leads to other errors if you use impersonation. For more information, see the "References" section of this article.

RESOLUTION

If you are using ASPCOMPAT mode with STA components, only create COM components from a method or one of the Page events (for example, Page_Load, Page_Init, and so on), and do not create these COM components at construction time.

For example, avoid a member declaration similar to the following, which creates the component at construction time:

Visual Basic .NET

<%@ 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>
                

Use the following code instead:

Visual Basic .NET

<%@ 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>
                

STATUS

This behavior is by design.

REFERENCES

For additional information, click the article number below to view the article in the Microsoft Knowledge Base:

325791 PRB: Access Denied Error Message Occurs When Impersonating in ASP.NET and Calling STA COM Components



Additional query words: performance decreases has negative impact on kbreadme

Keywords: kbhttpruntime kbinterop kbperformance kbprb kbreadme kbthread KB308095