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.
- Reproduzieren Sie den Fehler. Dies könnte einige Versuche und Irrtümer beinhalten.
- Klicken Sie im angezeigten Managed Debugging-Assistenten auf "OK" und nicht auf "Weiter".
- Stellen Sie sicher, dass die Symbolleiste "Speicherort debuggen" aktiv ist, indem Sie mit der rechten Maustaste auf den Andockbereich der Symbolleiste klicken und "Speicherort debuggen" auswählen. Sie sollten eine Dropdown-Liste mit der Bezeichnung "Thread" in der Symbolleiste sehen, wenn diese aktiv ist.
- Das ausgewählte Element in der Dropdown-Liste "Thread" sollte ein anderer Thread als der Haupt-Thread sein, da es sich um einen Hintergrund-Thread handelt, der sich darüber beschwert, dass der Haupt-Thread die gesamte Aufmerksamkeit auf sich zieht. Wählen Sie den Haupt-Thread in der Dropdown-Liste aus.
- Sie sollten jetzt den Code, der den Kontextwechsel blockiert, im Code-Editor sehen.
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
- Sie können einen MDA direkt im MDA-Dialogfeld deaktivieren, das angezeigt wird, wenn der Fehler auftritt, indem Sie das Kontrollkästchen "Unterbrechen, wenn dieser Ausnahmetyp ausgelöst wird" deaktivieren.
- Im Dialogfeld "Ausnahmeeinstellungen" anhand der folgenden Anweisungen von MSDN .
... klicken Sie im Menü Debuggen auf Ausnahmen. (Wenn das Debug-Menü keinen Ausnahmebefehl enthält, klicken Sie im Menü Extras auf Anpassen, um ihn hinzuzufügen.) Erweitern Sie im Dialogfeld Ausnahmen die Liste Verwaltete Debugging-Assistenten, und deaktivieren Sie das Kontrollkästchen Ausgeworfen für den einzelnen MDA.
Außerhalb des Visual Studio-Debuggers
- Registrierungsschlüssel (maschinenweit, alle betroffenen MDAs)
- Umgebungsvariable (Maschinenweit können MDAs angegeben werden)
- Anwendungskonfigurationseinstellungen (Anwendungsbereich, MDAs können angegeben werden)
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.