Ich habe eine Fehlermeldung erhalten, die ich nicht beheben kann. Es stammt aus Visual Studio oder dem Debugger. Ich bin nicht sicher, ob die endgültige Fehlerbedingung in VS, dem Debugger, meinem Programm oder der Datenbank liegt.
Dies ist eine Windows-App. Keine Web-App.
Die erste Nachricht von VS ist ein Popup-Fenster mit der Aufschrift: "Für keinen Aufrufstapel-Frame werden Symbole geladen. Der Quellcode kann nicht angezeigt werden." Wenn das weggeklickt wird, erhalte ich: " ContextSwitchDeadlock wurde erkannt ", zusammen mit einer langen Nachricht, die unten wiedergegeben wird.
Der Fehler tritt in einer Schleife auf, die eine DataTable durchsucht. Für jede Zeile wird ein Schlüsselwert (HIC #) aus der Tabelle als Parameter für einen SqlCommand verwendet. Mit dem Befehl wird ein SqlDataReader erstellt, der eine Zeile zurückgibt. Daten werden verglichen. Wenn ein Fehler erkannt wird, wird eine Zeile zu einer zweiten Datentabelle hinzugefügt.
Der Fehler scheint damit zu tun zu haben, wie lange die Prozedur dauert (dh nach 60 Sekunden), und nicht damit, wie viele Fehler gefunden werden. Ich denke nicht, dass es ein Speicherproblem ist. Innerhalb der Schleife werden keine Variablen deklariert. Die einzigen Objekte, die erstellt werden, sind die SqlDataReaders und befinden sich unter Verwenden von Strukturen. Das Hinzufügen von System.GC.Collect () hatte keine Auswirkung.
Die Datenbank ist eine SqlServer-Site auf demselben Laptop.
Das Formular enthält keine ausgefallenen Spielereien oder Gadgets.
Mir ist nichts in diesem Prozess bekannt, was sich stark von dem unterscheidet, was ich Dutzende Male zuvor getan habe. Ich habe den Fehler schon einmal gesehen, aber nie auf einer konsistenten Basis.
Irgendwelche Ideen, irgendjemand?
Vollständiger Fehlertext: Die CLR konnte 60 Sekunden lang nicht vom COM-Kontext 0x1a0b88 zum COM-Kontext 0x1a0cf8 wechseln. Der Thread, dem der Zielkontext / die Zielwohnung gehört, führt höchstwahrscheinlich entweder eine Wartezeit ohne Pumpen durch oder verarbeitet einen sehr lang laufenden Vorgang, ohne Windows-Nachrichten zu pumpen. Diese Situation wirkt sich im Allgemeinen negativ auf die Leistung aus und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder sich die Speichernutzung im Laufe der Zeit kontinuierlich ansammelt. Um dieses Problem zu vermeiden, sollten alle Single-Threaded-Apartment-Threads (STA-Threads) Pump-Wait-Grundelemente (wie CoWaitForMultipleHandles) verwenden und Nachrichten bei langen Betriebsabläufen routinemäßig pumpen.
quelle
ctrl-alt-e
bringt den Ausnahmedialog.Debug -> Windows -> Exceptions Settings
. Dann benutzen Sie die SucheWie Pedro sagte, haben Sie ein Problem mit dem Debugger, der die Nachrichtenpumpe verhindert, wenn Sie den Code durchlaufen.
Wenn Sie jedoch eine lange laufende Operation für den UI-Thread ausführen, rufen Sie Application.DoEvents () auf, das die Nachrichtenwarteschlange explizit pumpt und dann die Steuerung an Ihre aktuelle Methode zurückgibt.
Wenn Sie dies jedoch tun, würde ich empfehlen, sich Ihr Design anzusehen, damit Sie die Verarbeitung außerhalb des UI-Threads durchführen können, damit Ihre UI schön und bissig bleibt.
quelle
Es hört sich so an, als würden Sie dies im Haupt-UI-Thread der App tun. Der UI-Thread ist für das Pumpen von Windows-Nachrichten beim Eintreffen verantwortlich. Da Ihr Thread jedoch bei Datenbankaufrufen blockiert ist, kann er dies nicht tun. Dies kann Probleme mit systemweiten Nachrichten verursachen.
Sie sollten sich ansehen, wie Sie einen Hintergrund-Thread für den lang laufenden Vorgang erstellen und währenddessen eine Art "Ich bin beschäftigt" -Dialog für den Benutzer einrichten.
quelle
Deaktivieren Sie in Visual Studio 2017 die Option ContextSwitchDeadlock durch:
Debug> Windows> Ausnahmeeinstellungen
In Ausnahmeeinstellungsfenstern: Deaktivieren Sie die Option ContextSwitchDeadlock
quelle
Wenn Sie diese Ausnahme nicht deaktivieren möchten, müssen Sie Ihre Anwendung nur mindestens alle 60 Sekunden einige Nachrichten pumpen lassen. Dadurch wird diese Ausnahme verhindert. Versuchen Sie ab und zu, System.Threading.Thread.CurrentThread.Join (10) aufzurufen. Es gibt andere Anrufe, mit denen Sie die Nachrichten pumpen lassen können.
quelle
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 im Test-Explorer zu "debuggen", wenn Ihre Lösung nicht auf Debug eingestellt ist.
In diesem Fall müssen Sie Ihre Lösung von Release oder in diesem Fall auf Debug ändern. Wenn dies das Problem ist, hilft Ihnen das Ändern von "ContextSwitchDeadlock" nicht wirklich.
Ich habe das selbst verpasst, weil die Fehlermeldung so böse war, dass ich die offensichtliche Debug-Einstellung nicht überprüft habe!
quelle
In der spanischen Version von Visual Studio 2017.
und suchen Sie nach "ContextSwitchDeadlock". Deaktivieren Sie es dann. Oder Verknüpfung
Beste.
quelle
Sie können dies lösen, indem Sie das Kontrollkästchen contextwitchdeadlock von deaktivieren
Debug-> Ausnahmen ... -> MDA-Knoten erweitern -> Deaktivieren -> Contextswitchdeadlock
quelle
Ich habe diesen Fehler erhalten und die Abfragen auf async umgestellt (warte (...). ToListAsync ()). Alles gut jetzt.
quelle