221 Stimmen

Visual Studio: ContextSwitchDeadlock

Ich habe eine Fehlermeldung erhalten, die ich nicht beheben kann. Sie stammt von Visual Studio oder dem Debugger. Ich bin mir nicht sicher, ob die eigentliche Fehlerbedingung in VS, im Debugger, in meinem Programm oder in der Datenbank liegt.

Dies ist eine Windows-Anwendung. Keine Web-App.

Die erste Meldung von VS ist ein Popup-Fenster mit der Meldung: "Es sind keine Symbole für einen Aufrufstapelrahmen geladen. Der Quellcode kann nicht angezeigt werden." Wenn das weggeklickt wird, erhalte ich: " ContextSwitchDeadlock wurde entdeckt ", zusammen mit einer langen Nachricht, die im Folgenden wiedergegeben wird.

Der Fehler tritt in einer Schleife auf, in der eine DataTable durchsucht wird. Für jede Zeile wird ein Schlüsselwert (HIC #) aus der Tabelle als Parameter für einen SqlCommand verwendet. Der Befehl wird verwendet, um einen SqlDataReader zu erstellen, der eine Zeile zurückgibt. Die Daten werden verglichen. Wird ein Fehler festgestellt, wird eine Zeile zu einer zweiten DataTable hinzugefügt.

Der Fehler scheint damit zusammenzuhängen, wie lange die Prozedur dauert (d. h. nach 60 Sekunden), und nicht damit, wie viele Fehler gefunden werden. Ich glaube nicht, dass es ein Speicherproblem ist. Innerhalb der Schleife werden keine Variablen deklariert. Die einzigen Objekte, die erstellt werden, sind die SqlDataReader, und sie befinden sich in Using-Strukturen. Das Hinzufügen von System.GC.Collect() hatte keine Wirkung.

Die Datenbank ist eine SqlServer-Site auf demselben Laptop.

Das Formular enthält keine ausgefallenen Spielereien oder Gadgets.

Mir ist nichts bekannt, was sich wesentlich von dem unterscheidet, was ich schon dutzende Male gemacht habe. Ich habe den Fehler schon einmal gesehen, aber nie auf einer konsistenten Basis.

Hat jemand eine Idee?

Vollständiger Fehlertext: Die CLR war 60 Sekunden lang nicht in der Lage, vom COM-Kontext 0x1a0b88 zum COM-Kontext 0x1a0cf8 zu wechseln. Der Thread, der den Zielkontext/das Ziel-Apartment besitzt, führt höchstwahrscheinlich entweder ein nicht pumpendes Warten durch oder verarbeitet eine sehr lange laufende Operation ohne das Pumpen von Windows-Nachrichten. Diese Situation wirkt sich im Allgemeinen negativ auf die Leistung aus und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder die Speichernutzung im Laufe der Zeit kontinuierlich ansteigt. Um dieses Problem zu vermeiden, sollten alle Single Threaded Apartment (STA) Threads pumping wait primitives (wie CoWaitForMultipleHandles) verwenden und routinemäßig Nachrichten während lang laufender Operationen pumpen.

3voto

Ewan Punkte 489

Die obige Lösung ist in einigen Szenarien gut, aber es gibt ein anderes Szenario, in dem dies passiert, wenn Sie Unit-Tests durchführen und versuchen, "Ausgewählte Tests debuggen" aus dem Test-Explorer, wenn Sie die Lösung nicht auf Debuggen eingestellt ist.

In diesem Fall müssen Sie Ihre Lösung von Release oder was auch immer in diesem Fall auf Debug eingestellt ist, ändern. Wenn dies das Problem ist, dann wird die Änderung von "ContextSwitchDeadlock" Ihnen nicht wirklich helfen.

Ich habe das selbst übersehen, weil die Fehlermeldung so hässlich war, dass ich das Offensichtliche nicht überprüft habe, nämlich die Debug-Einstellung!

3voto

kahonmlg Punkte 3191

In der spanischen Version von Visual Studio 2017.

"Depurar" -> "Ventanas" -> "Configuración de Excepciones"

und suchen Sie "ContextSwitchDeadlock". Deaktivieren Sie es dann. Oder Abkürzung

Strg+D,E

Das Beste.

2voto

KR Akhil Punkte 633

Sie können dieses Problem lösen, indem Sie die Option contextswitchdeadlock aus

Debug->Ausnahmen ... -> MDA-Knoten aufklappen -> Häkchen entfernen -> Contextswitchdeadlock

2voto

Andrew Gale Punkte 41

Ich hatte dieses Problem auch und habe es gelöst, indem ich "await" zu meinen Themen hinzugefügt habe:

Await Task.WhenAll(taskList.ToArray())
Await Task.Run(myAction)

1voto

dunwan Punkte 1467

Ich war immer diesen Fehler und schaltete die Abfragen zu async (await (...).ToListAsync()). Jetzt ist alles gut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X