contextSwitchDeadlock-MDA
Hinweis
Dieser Artikel gilt für das .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.
Der contextSwitchDeadlock
-MDA (Managed Debugging Assistant, Assistent für das verwaltete Debuggen) wird aktiviert, wenn während eines versuchten COM-Kontextübergangs ein Deadlock erkannt wird.
Symptome
Das häufigste Symptom ist, dass ein Aufruf einer nicht verwalteten COM-Komponente aus verwaltetem Code nicht zurückgegeben wird. Ein weiteres Symptom ist die im Zeitverlauf zunehmende Speicherauslastung.
Ursache
Die wahrscheinlichste Ursache ist, dass ein Thread in einem Singlethread-Apartment (STA) keine Meldungen weiterleitet. Entweder wartet der STA-Thread, ohne Meldungen weiterzuleiten, oder er führt langwierige Operationen aus und lässt keine Weiterleitungen durch die Meldungswarteschlange zu.
Die im Zeitverlauf zunehmende Speicherauslastung wird durch den Finalizerthread verursacht, der versucht, Release
für eine nicht verwaltete COM-Komponente aufzurufen, von der keine Rückgabe erfolgt. Dadurch wird verhindert, dass der Finalizer andere Objekte freigibt.
Standardmäßig wird STA als Threadingmodell für den Hauptthread von Visual Basic-Konsolenanwendungen verwendet. Dieser MDA wird aktiviert, wenn ein STA-Thread COM-Interoperabilität entweder direkt oder indirekt über die Common Language Runtime oder ein Drittanbieter-Steuerelement verwendet. Um zu vermeiden, das dieser MDA in einer Visual Basic-Konsolenanwendung aktiviert wird, wenden Sie das MTAThreadAttribute-Attribut auf die Hauptmethode an, oder ändern Sie die Anwendung so, dass sie Meldungen weiterleitet.
Unter Umständen wird dieser MDA fälschlicherweise aktiviert, wenn alle folgenden Bedingungen erfüllt sind:
Eine Anwendung erstellt entweder direkt oder indirekt über Bibliotheken COM-Komponenten von STA-Threads.
Die Anwendung wurde im Debugger angehalten, und der Benutzer hat entweder die Ausführung der Anwendung fortgesetzt oder einen Ausführungsschritt durchgeführt.
Nicht verwaltetes Debuggen ist nicht aktiviert.
Um festzustellen, ob der MDA fälschlicherweise aktiviert wurde, deaktivieren Sie alle Haltepunkte, starten Sie die Anwendung neu, und führen Sie sie ohne Unterbrechung aus. Wenn der MDA nicht aktiviert wird, war die erste Aktivierung wahrscheinlich falsch. Deaktivieren Sie in diesem Fall den MDA, um eine Störung der Debugsitzung zu vermeiden.
Hinweis
Dieser MDA befindet sich im Standardsatz für Visual Studio. Informationen zum Deaktivieren von MDAs finden Sie unter Diagnostizieren von Fehlern mit Assistenten für verwaltetes Debuggen.
Lösung
Befolgen Sie die COM-Regeln hinsichtlich der STA-Meldungsweiterleitung.
Auswirkungen auf die Laufzeit
Dieser MDA hat keine Auswirkungen auf die CLR. Es werden nur Angaben über COM-Kontexte gemeldet.
Ausgabe
Eine Meldung, die den aktuellen Kontext und den Zielkontext beschreibt.
Konfiguration
<mdaConfig>
<assistants>
<contextSwitchDeadlock />
</assistants>
</mdaConfig>