Tipps und Tricks

Hier finden Sie verschiedene Tipps und Tricks rund um C#, .NET und Visual Studio (Verschieden Versionen).

ContextSwitchDeadlock erkennen und umgehen

Fehlermeldung

Message
ContextSwitchDeadlock wurde erkannt. Message: Die CLR konnte 60 Sekunden lang keinen Übergang vom COM-Kontext 0x2c32f90 zum COM-Kontext 0x2c331e0 durchführen. Der Thread, der Besitzer des Zielkontexts/-apartments ist, wartet entweder, ohne Meldungen zu verschieben, oder verarbeitet eine äußerst lang dauernde Operation, ohne Windows-Meldungen zu verschieben. Eine solche Situation beeinträchtigt in der Regel die Leistung und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder die Speicherauslastung immer weiter zunimmt. Zur Vermeidung dieses Problems sollten alle STA-Threads (Singlethread-Apartment) primitive Typen verwenden, die beim Warten Meldungen verschieben (z.B. CoWaitForMultipleHandles), und bei lange dauernden Operationen generell Meldungen verschieben.

Diese trit beim abfragen von Fenstertitelnder Anwendungen auf, der Code dazu:

  1. public string Text
  2. {
  3. get
  4. {
  5. try
  6. {
  7. StringBuilder title = new StringBuilder(260, 260);
  8. UnManagedMethods.GetWindowText(this.hWnd, title, title.Capacity);
  9. return title.ToString();
  10. }
  11. catch{return "";}
  12. }
  13. }
  14. private class UnManagedMethods
  15. {
  16. [DllImport("user32", CharSet = CharSet.Auto)]
  17. public extern static int GetWindowText(IntPtr hWnd, StringBuilder lpString, int cch);
  18. ...
  19. }

Der code wird in Visual Studio 2019 im Debug Modus ausgeführt. Wie kann man dieses „hängen bleiben“ erkennen und abbrechen, gibt es da überhaupt eine Möglichkeit?

Erklärung

Wenn man im Debug Modus anhält, dann werden auch keine Windows-Nachrichten mehr verarbeitet. Das heißt, die COM-Komponente verarbeitet eine Windows-Nachricht, die verursacht, dass in deinen Code gesprungen wird. Sollte dann binnen 60 Sekunden keine Rückantwort kommen, dann erhälst Du diese Fehlermeldung, weil die COM Komponente keine weiteren Nachrichten verarbeiten kann derweil.

Lösung

Einfach die Exception in den Visual Studio Einstellungen abschalten.


In Visual Studio 2019 zusätzliche Debug Informationen auschalten

Zusätzliche Debug Informationen

Die Standardeinstellungen in Visual Studio 2019 zeigt oben auf jedem WPF Fenster zusätziche Tool zum debugen des Programm an. Nachteil ist, dass damit auch darunterliegende Komponenten verdeckt werden. Mit folgenden Schritten lässt sich das auch ausschalten:

English Version : Tools → Options → Debugging → General → Enable UI Debugging Tools for XAML Deutsche Version : Extras → Optionen → Debugging → Allgemein → UI-Debugtool für XAML aktivieren

Setzen oder entfernen Sie einfach das Häckchen.