contextSwitchDeadlock MDA

Note

Dieser Artikel ist spezifisch für .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.

Der contextSwitchDeadlock verwaltete Debugging-Assistent (Managed Debugging Assistant, MDA) 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, dass die Speicherauslastung im Laufe der Zeit zunimmt.

Ursache

Die wahrscheinlichste Ursache ist, dass ein STA-Thread (SingleThreaded Apartment) keine Nachrichten pumpt. Der STA-Thread wartet entweder ohne Pumpen von Nachrichten oder führt langwierige Vorgänge durch und lässt die Nachrichtenwarteschlange nicht pumpen.

Die Arbeitsspeicherauslastung im Laufe der Zeit wird durch den Finalizerthread verursacht, der versucht, eine nicht verwaltete COM-Komponente aufzurufen Release , und diese Komponente wird nicht zurückgegeben. Dadurch wird verhindert, dass der Finalizer andere Objekte zurückgibt.

Standardmäßig ist das Threadingmodell für den Hauptthread Visual Basic Konsolenanwendungen STA. Dieser MDA wird aktiviert, wenn ein STA-Thread com-Interoperabilität entweder direkt oder indirekt über die Common Language Runtime oder ein Drittanbietersteuerelement verwendet. Um die Aktivierung dieser MDA in einer Visual Basic Konsolenanwendung zu vermeiden, wenden Sie das MTAThreadAttribute Attribut auf die Hauptmethode an, oder ändern Sie die Anwendung auf Pumpnachrichten.

Es ist möglich, dass dieser MDA falsch aktiviert wird, wenn alle folgenden Bedingungen erfüllt sind:

  • Eine Anwendung erstellt COM-Komponenten aus STA-Threads entweder direkt oder indirekt über Bibliotheken.

  • Die Anwendung wurde im Debugger beendet, und der Benutzer hat entweder die Anwendung fortgesetzt oder einen Schrittvorgang ausgeführt.

  • Das nicht verwaltete Debuggen ist nicht aktiviert.

Um festzustellen, ob die MDA falsch aktiviert wird, deaktivieren Sie alle Haltepunkte, starten Sie die Anwendung neu, und lassen Sie die Ausführung zu, ohne den Vorgang zu beenden. Wenn die MDA nicht aktiviert ist, ist die anfängliche Aktivierung wahrscheinlich falsch. Deaktivieren Sie in diesem Fall die MDA, um Störungen mit der Debugsitzung zu vermeiden.

Note

Diese MDA befindet sich im Standardsatz für Visual Studio. Informationen zum Deaktivieren von MDAs finden Sie unter Diagnosefehler mit verwalteten Debugging-Assistenten.

Auflösung

Befolgen Sie COM-Regeln für STA-Nachrichtenpumping.

Effekt auf die Laufzeit

Diese MDA hat keine Auswirkungen auf die CLR. Es werden nur Daten zu COM-Kontexten gemeldet.

Output

Eine Meldung, die den aktuellen Kontext und den Zielkontext beschreibt.

Konfiguration

<mdaConfig>
  <assistants>
    <contextSwitchDeadlock />
  </assistants>
</mdaConfig>

Siehe auch