Ich führe eine C # -Anwendung aus und erhalte zur Laufzeit die folgende Fehlermeldung:
Die CLR konnte 60 Sekunden lang nicht vom COM-Kontext 0x20e480 zum COM-Kontext 0x20e5f0 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 (z. B. CoWaitForMultipleHandles) verwenden und bei langen Betriebsabläufen routinemäßig Nachrichten pumpen.
Kann mir bitte jemand bei dem Problem hier helfen?
Danke vielmals.
quelle
Mit den folgenden Schritten können Sie feststellen, welche Operation den Kontextwechsel blockiert und die Anzeige des contextSwitchDeadlock-MDA bewirkt . Beachten Sie, dass ich mich auf Visual Studio 2012 beziehe.
Angenommen, Sie entscheiden sich dagegen, den ressourcenintensiven Vorgang von Ihrem Hauptthread zu entfernen. Sehen Sie sich hier einige der anderen Antworten und Kommentare an, bevor Sie dies tun. Sie haben die folgenden Optionen, um die Assistenten für verwaltetes Debuggen zu deaktivieren.
Im Visual Studio Debugger
Außerhalb des Visual Studio-Debuggers
Hinweis: Eine der ersten beiden Optionen muss auf 1 gesetzt werden, damit die dritte Wirkung erzielt wird.
In meinem Fall war das Problem ein Aufruf von ObjectContext.SaveChanges () im Entity Framework innerhalb einer Konsolenanwendung. Mit dem MTAThreadAttribute der angelegten
Main()
Methode Ausnahme der ContextSwitchDeadlock wurde nicht mehr angehoben . Ich bin mir leider nicht sicher, welche Auswirkungen diese Änderung hat.quelle
Diese Nachricht zeigt an, dass ein Code von Ihnen versucht, den Thread zu wechseln, und der Ziel-Thread beschäftigt ist. Beispiel: Ein Hintergrund-Thread, der versucht, einen Aufruf an den UI-Thread zu senden, um die Benutzeroberfläche zu aktualisieren, während die Benutzeroberfläche eine Weile eine enge Schleife ausführt.
Um tatsächlich herauszufinden, was los ist, müssen Sie in den Debugger einbrechen und sich alle Threads ansehen und sehen, was sie tun.
quelle
In einigen Fällen:
Debuggen -> Ausnahmen -> Verwaltete Debug-Assistenten
und Deaktivieren des Elements ContextSwitchDeadlock.
quelle
Wählen Sie einfach Ausnahmen aus dem Debug-Menü im Visual Studio 2005-Fenster aus. Das Dialogfeld Edxception wird angezeigt. Wählen Sie den Ausnahmeknoten für verwaltete Debugging-Assistenten aus, wählen Sie dann ContextSwitchDeadlock aus und entfernen Sie die Auswahl aus der geworfenen Spalte. Dadurch wird verhindert, dass vs die ContextSwitchDeadlock-Ausnahme auslöst.
Hoffe das hilft..
quelle
Ich bin auf dieses Problem gestoßen, als ich herausfinden wollte, warum ich
OracleDataReader
eine Ausnahme ausgelöst habe. Ich dachte, es lag daran, dass es zugewiesen wurde,null
weil die Ausnahme mit einem Parameter zusammenhängt, der `null ist. So tat ich:while (dr.Read()) { while (dr != null) // <-- added this line { ...
Es stellte sich heraus, dass das
dr
NIE null war, und so ging die Schleife einfach weiter und weiter, bis diese Nachricht eintraf, und weiter und weiter, weil Sie auf "Weiter" klicken können, um sie fortzusetzen, bis Ihnen der Speicher ausgeht (tun Sie dies nicht - Klicken Sie stattdessen auf "OK". Suchen Sie also nach Speicherlecks, die Daten aus der Datenbank in Schleifen bis ins Unendliche in den Speicher streamen. Der Fehler versucht tatsächlich, Sie vor einem schlechten Szenario zu warnen. Am besten beachten.quelle
Dieser Fehler trat bei mir mehrfach auf und ich habe ihn auf eine Iteration in zurückgeführt
DataGridViewRow
, in der ich den Kontrollkästchenwert auf true gesetzt habe. Da ich im Debug-Modus lief, hatte ich die Möglichkeit, fortzufahren, sodass ich genau dies tun konnte.Ich hoffe das hilft jemandem.
quelle
Angenommen, Sie verwenden Visual Studio, können Sie
Ctrl+Alt+E
in das aktuelle Projekt klicken. Das Ausnahmefenster wird mit ausgewählten Managed Debugging-Assistenten angezeigt. Deaktivieren Sie die Option "ContextSwitchDeadlock". Erstellen Sie dann ein aktuelles Projekt.quelle