PRB: Erstellen von STA-Komponenten in der Konstruktor in ASP.NET ASPCOMPAT Mode Negatively auf die Leistung

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 308095 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Alles erweitern | Alles schließen

Problembeschreibung

Wenn Sie von einer ASP.NET-Seite in ASPCOMPAT Mode Apartmentthread-Komponenten aufrufen, stellen Sie möglicherweise erheblichen Leistungsabfall fest.

Ursache

Wenn Sie ASPCOMPAT-Modus verwenden (d. h. Wenn Sie eine Seite mit den verwenden < % @ ASPCOMPAT = "true" %>-Direktive), führt ASP.NET diese Seiten auf ein STA-Threadpool. Allerdings COM-Komponenten, die zur Konstruktionszeit erstellt werden vom Typ int ist erstellt werden, bevor die Anforderung an den Threadpool Singlethread-Apartment (STA) geplant ist und es werden daher von einem Multithread-Apartment (MTA)-Thread erstellt. In diesem Szenario kommt es zu erheblichen Leistungseinbußen.

Die meisten erheblich führt im gleichen Thread (Host STA) alle Instanzen von Apartmentthread-Komponenten, die vom MTA-Threads erstellt werden. Dies bedeutet, dass Obwohl alle Benutzer einen Verweis auf eine eigene Instanz der COM-Komponente verfügen, alle Aufrufe in diese Komponenten auf diesem einen Thread serialisiert werden (nur ein Aufruf führt zu einem Zeitpunkt aus).

Darüber hinaus ist eine kleinere Leistungseinbruch jedes Mal auf die Komponente aus Ereignisse des Page -aufgrund eines Schalters Thread aufgerufen wird. Dies ist da Ereignisse des Page auf einem Thread aus dem Pool STA ausgeführt werden, aber die COM-Komponente noch auf Host STA ausgeführt (da die COM-Komponente von einem MTA-Client erstellt wurde). Dieser Thread-Schalter führt auch zu anderen Fehlern, wenn Sie Identitätswechsel verwenden. Weitere Informationen finden Sie unter im Abschnitt "Informationsquellen" dieses Artikels.

Lösung

Bei Verwendung von ASPCOMPAT-Modus mit STA-Komponenten nur erstellen Sie COM-Komponenten von einer Methode oder eines der Page -Ereignisse (z. B. Page_Load , Page_Init und usw.), und erstellen Sie diese COM-Komponenten nicht zur Konstruktionszeit.

Vermeiden Sie z. B. einer Memberdeklaration ähnlich dem folgenden, die die Komponente zur Konstruktionszeit erstellt:

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>
				
verwenden Sie stattdessen den folgenden Code:

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

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Informationsquellen

Weitere Informationen finden Sie die Artikel der Microsoft Knowledge Base:
325791PRB: Zugriff verweigert Fehlermeldung Wenn Identitätswechsel in ASP.NET und Callingcard STA COM-Komponenten erfolgt

Eigenschaften

Artikel-ID: 308095 - Geändert am: Montag, 24. Februar 2014 - Version: 2.9
Die Informationen in diesem Artikel beziehen sich auf:
  • 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
Keywords: 
kbnosurvey kbarchive kbmt kbhttpruntime kbinterop kbperformance kbprb kbreadme kbthread KB308095 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 308095
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

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