Pour trouver l'opération qui bloque le changement de contexte et qui provoque le message contextSwitchDeadlock MDA à afficher, vous pouvez suivre les étapes suivantes. Notez que je vais faire référence à Visual Studio 2012.
- Reproduisez l'erreur. Cela peut impliquer quelques essais et erreurs.
- Cliquez sur "OK" plutôt que sur "Continuer" dans l'assistant de débogage géré qui s'affiche.
- Vérifiez que la barre d'outils Debug Location est active en cliquant avec le bouton droit de la souris sur la zone d'ancrage de la barre d'outils et en sélectionnant "Debug Location". Si la barre d'outils est active, vous devriez voir apparaître une liste déroulante intitulée "Thread".
- L'élément sélectionné dans la liste déroulante Thread doit être un fil autre que le fil principal, car il s'agit d'un fil d'arrière-plan qui se plaint que le fil principal accapare toute l'attention. Sélectionnez le fil principal dans la liste déroulante.
- Vous devriez maintenant voir le code qui bloque le changement de contexte dans l'éditeur de code.
En supposant que vous décidiez de ne pas déplacer l'opération gourmande en ressources hors du fil d'exécution principal - jetez d'abord un coup d'œil à certaines des autres réponses et commentaires ici - vous disposez des options suivantes pour désactiver les assistants de débogage gérés.
Dans le débogueur de Visual Studio
- Vous pouvez désactiver un MDA directement dans la boîte de dialogue MDA qui s'affiche lorsque l'erreur se produit. qui s'affiche lorsque l'erreur se produit, en décochant la case "Break when this type d'exception est déclenché".
- Avec la boîte de dialogue Paramètres d'exception en suivant les instructions ci-dessous de MSDN .
...dans le menu Debug, cliquez sur Exceptions. (Si le menu Debug ne contient pas de commande Exceptions, cliquez sur Personnaliser dans le menu Outils pour l'ajouter). Dans la boîte de dialogue Exceptions, développez la liste Managed Debugging Assistants (assistants de débogage gérés), puis décochez la case Thrown (lancé) pour chaque MDA.
En dehors du débogueur de Visual Studio
-
Clé de registre (A l'échelle de la machine, tous les MDAs concernés)
-
Variable d'environnement (à l'échelle de la machine, les MDA peuvent être spécifiés)
-
Paramètres de configuration de l'application (Champ d'application, les MDAs peuvent être spécifiés)
Note : L'une des deux premières options doit être mise à 1 pour que la troisième ait un effet.
Dans mon cas, le problème était un appel à ObjectContext.SaveChanges() dans l'Entity Framework au sein d'une application console. Avec le MTAThreadAttribute appliqué à la Main()
méthode l'exception ContextSwitchDeadlock n'était plus levée . Je ne suis malheureusement pas certain des effets complets de ce changement.