Visual Studio: ContextSwitchDeadlock
Habe ich immer eine Fehlermeldung, dass ich nicht lösen kann. Es stammt aus Visual Studio oder den debugger. Ich bin mir nicht sicher, ob der letztendliche Fehler ist im VS der debugger mein Programm oder der Datenbank.
Dies ist eine Windows-Anwendung. Nicht eine web-app.
Erste Nachricht aus VS wird ein popup-Fenster sagt:
"Keine Symbole geladen für jeden Aufruf-stack-frame. Der Quellcode kann nicht angezeigt werden."
Wenn das weggeklickt, bekomme ich:
"ContextSwitchDeadlock erkannt wurde", zusammen mit einer langen Nachricht unten reproduziert.
Der Fehler tritt in einer Schleife durchsucht nach unten eine DataTable. Für jede Zeile, es verwendet einen Schlüssel (HIC #) Wert aus der Tabelle, die als parameter für ein SqlCommand. Der Befehl zum erstellen eines SqlDataReader liefert eine Zeile. Daten verglichen werden. Wenn ein Fehler erkannt wird, wird eine Zeile Hinzugefügt, um eine zweite DataTable.
Der Fehler scheint zu sein, im Zusammenhang damit, wie lange das Verfahren dauert zu laufen (also nach 60 sec), nicht, wie viele Fehler gefunden werden. Ich glaube nicht, dass es ein Speicher-Problem. Keine Variablen deklariert, die innerhalb der Schleife. Die einzigen Objekte, die erstellt werden, sind die SqlDataReaders, und Sie sind Mit Strukturen. System Hinzufügen.GC.Collect() keinen Effekt hatten.
Die db ist eine SQL Server-Website auf dem gleichen laptop.
Es gibt keine ausgefallenen Spielereien oder Spielereien auf dem Formular.
Ich bin mir nicht bewusst irgendetwas in dieser proc ist sehr Verschieden von dem, was ich getan habe Dutzende Male vor. Ich habe den Fehler gesehen, aber noch nie auf einer einheitlichen Grundlage.
Irgendwelche Ideen, jedermann?
Vollständige Fehlertext:
Die CLR nicht in der Lage war, den übergang vom COM-Kontext 0x1a0b88 zum COM-Kontext 0x1a0cf8 für 60 Sekunden. Der thread, der Besitzer der Ziel-Kontext/apartment ist am ehesten entweder eine nicht Pumpen warten oder Verarbeitung eine sehr lange Laufenden Betrieb ohne Pumpen Windows-Meldungen. Diese situation hat in der Regel negative Auswirkungen auf die Leistung und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder Speicherauslastung akkumulieren kontinuierlich über die Zeit. Um dieses problem zu vermeiden, werden alle single-threaded apartment (STA) threads verwenden sollten, Pumpen warten primitive (wie CoWaitForMultipleHandles) und routinemäßig Pumpe-Meldungen während der lang andauernden Operationen.
InformationsquelleAutor der Frage SeaDrive | 2009-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
ContextSwitchDeadlock
bedeutet nicht notwendigerweise, dass Ihr code hat ein Problem, nur, dass es ein potential. Wenn Sie gehen, umDebug > Exceptions
im Menü und erweitern Sie dieManaged Debugging Assistants
finden SieContextSwitchDeadlock
aktiviert ist. Wenn Sie diese Funktion deaktivieren, VS wird nicht mehr gewarnt, wenn Objekte nehmen eine lange Zeit zu verarbeiten. In einigen Fällen, die Sie gültig ist, haben ein lang andauernder Vorgang. Es ist auch hilfreich, wenn Sie Debuggen und haben angehalten, auf eine Linie, während dies ist die Verarbeitung - Sie wollen es nicht, sich zu beschweren, bevor Sie die chance hatten zu Graben, in ein Problem.InformationsquelleAutor der Antwort Pedro
Wie Pedro sagte, Sie haben ein Problem mit dem debugger zu verhindern das Nachrichtensystem, wenn Sie den code schrittweise.
Aber wenn Sie die Durchführung einer lange Laufenden operation auf dem UI-thread, dann rufen Sie Anwendung.DoEvents (), die explizit Pumpen die message queue und gibt dann die Kontrolle, um Ihre aktuellen Methode.
Aber wenn Sie das tun, würde ich empfehlen, bei der Suche in Ihrem design, so dass Sie können führen Sie die Bearbeitung aus dem UI-thread, so dass Ihre Benutzeroberfläche bleibt schön und bissig.
InformationsquelleAutor der Antwort Spence
Es klingt wie Sie tun dies auf der main-UI-thread der app. Der UI-thread ist verantwortlich für das Pumpen von windows-Nachrichten als anzukommen, und doch, weil Ihr blockiert, in Datenbank-Aufrufe, die es nicht zu tun. Dies kann zu Problemen mit der system-weiten Nachrichten.
Sollten Sie schauen, und erzeugt einen hintergrund-thread für die lang Laufenden Betrieb und das aufstellen eine Art von "ich bin beschäftigt" - dialog für den Benutzer, während es passiert.
InformationsquelleAutor der Antwort Rob Walker
Wenn Sie nicht möchten, deaktivieren Sie diese Ausnahme, alle Sie tun müssen ist, lassen Sie Ihre Anwendung Pumpe einige Nachrichten mindestens einmal alle 60 Sekunden. Es wird verhindert, dass diese Ausnahme zu passieren.
Versuchen Sie den Aufruf System.Threading.Thread.CurrentThread.Join(10) einmal in eine Weile. Es gibt noch andere Anrufe, die Sie tun können, lassen Sie die Nachrichten Pumpe.
InformationsquelleAutor der Antwort
In Visual Studio 2017 Spanische version.
und Suche "ContextSwitchDeadlock".
Dann deaktivieren Sie es.
Oder-Verknüpfung
Besten.
InformationsquelleAutor der Antwort kahonmlg
Die oben genannte Lösung ist gut, in einigen Szenarien, aber es gibt ein anderes Szenario, in denen dies geschieht, wenn Sie unit-Tests und Sie versuchen zu "Debuggen" Ausgewählte Tests" aus der Test-Explorer, wenn Sie die Lösung nicht Debuggen.
In diesem Fall müssen Sie ändern Sie Ihre Lösung von der Version oder was auch immer es ist, legen Sie zum Debuggen in diesem Fall. Wenn dies der Fall ist, dann ändern "ContextSwitchDeadlock" nicht wirklich helfen.
Ich habe dieses mir, denn die Fehlermeldung war so böse, ich habe nicht überprüfen Sie die offensichtliche Sache, die war, die Debug-Einstellung!
InformationsquelleAutor der Antwort Ewan
Sie können dies lösen, indem contextswitchdeadlock von
Debug->Ausnahmen ... -> öffnen Sie MDA-Knoten -> deaktivieren -> contextswitchdeadlock
InformationsquelleAutor der Antwort KR Akhil