78 votes

Erreur ContextSwitchDeadlock détectée en C #

Je suis en cours d'exécution d'une application en C#, et au cours de l'exécution j'obtiens l'erreur suivante:

Le CLR a pas été en mesure de faire la transition de COM contexte 0x20e480 COM contexte 0x20e5f0 pendant 60 secondes. Le thread qui possède la destination contexte/appartement est le plus susceptible de le faire non de pompage d'attendre ou de traitement d'un très long est en cours d'exécution, sans pompage, les messages de Windows. Cette situation a généralement un impact négatif sur les performances et peut même conduire à l'application devient non conforme ou de l'utilisation de la mémoire accumulent continuellement au fil du temps. Pour éviter ce problème, tous les single threaded apartment (STA) threads doit utiliser de pompage attendre primitives (comme CoWaitForMultipleHandles) et régulièrement pompe messages pendant longtemps l'exécution des opérations.

Quelqu'un peut-il m'aider avec le problème ici?

Merci beaucoup.

122voto

Hans Passant Points 475940

Le thread principal de votre programme a été occupé à l'exécution de code pour une minute. Ce n'est pas prendre soin de ses fonctions habituelles, le pompage de la boucle de message. C'est illégal lorsque vous utilisez des serveurs COM dans un thread de travail: les appels de leurs méthodes ne peuvent pas être expédiées jusqu'à ce que votre thread principal va à nouveau inactif.

Il doit être facilement visible, votre INTERFACE utilisateur doit être mort à la porte des ongles. Windows devrait avoir remplacé votre fenêtre principale avec un fantôme qui affiche "Pas de Réponse". La fermeture de la fenêtre ne fonctionne pas, pas de cliquez sur événements ont eu aucun effet.

Quel que soit votre thread principal est de faire doit être fait par un thread de travail à la place. L' BackgroundWorker classe est bon pour cela, vous trouverez beaucoup de l'utilisation de l'aide dans l'article de MSDN Library. Utiliser Debug + Pause Tous, Debug + Windows + Threads si vous n'avez aucune idée de ce que le thread principal est en train de faire.

Encore une cause possible: assurez-vous d'installer le service pack 1 si vous utilisez la version RTM de VS2005.

49voto

Scott Munro Points 4008

Pour trouver l'opération qui bloque le changement de contexte et origine du contextSwitchDeadlock MDA pour être affiché, vous pouvez utiliser les étapes suivantes. Remarque que je vais faire référence à Visual Studio 2012.

  1. Reproduire l'erreur. Cela pourrait impliquer quelques essais et erreurs.
  2. Cliquez sur " OK "plutôt que de "Continuer" dans la gestion de Débogage de l'assistant qui s'affiche.
  3. S'assurer que l'Emplacement de Débogage de la barre d'outils est active par un clic droit sur la barre d'outils de la zone d'ancrage et en sélectionnant 'Emplacement de Débogage'. Vous devriez voir une liste déroulante étiquetés "Thread" dans la barre d'outils si elle est active.
  4. L'élément sélectionné dans le Fil dans la liste déroulante doit être un thread autre que le thread principal, car il sera un thread d'arrière-plan qui se plaint que le thread principal est d'accaparer toute l'attention. Sélectionnez le thread principal dans la liste déroulante.
  5. Vous devriez maintenant voir le code qui bloque le changement de contexte dans l'éditeur de code.

En supposant que vous décidez contre le transfert de l'exploitation intensive des ressources des opérations hors de votre thread principal de prendre un coup d'oeil à certains de l'autre des réponses et des commentaires ici avant de vous faire - vous avez les options suivantes pour désactiver le Débogage Managé des Assistants.

Dans le Débogueur de Visual Studio

  1. Vous pouvez désactiver une MDA directement dans le MDA boîte de dialogue qui s' affiché lorsque l'erreur se produit en décochant " Pause lorsque cette type d'exception est levée'.
  2. À l'Exception des Paramètres de la boîte de dialogue en utilisant les instructions ci-dessous à partir de MSDN.

...dans le menu Déboguer, cliquez sur Exceptions. (Si le menu Déboguer ne contient pas d'Exceptions de commande, cliquez sur Personnaliser dans le menu Outils pour l'ajouter.) Dans la boîte de dialogue Exceptions, développez la gestion Assistants de Débogage de la liste, puis désactivez la Levée case à cocher pour l'individu MDA.

En dehors de le Débogueur de Visual Studio

  1. Clé de registre (Machine de Large, Tous les MDAs touchés)
  2. Variable d'environnement (Machine de Large, MDAs peut être spécifié)
  3. Application des Paramètres de Configuration (portée de l'Application, MDAs peut être spécifié)

Remarque: l'Une des deux premières options doivent être mis à 1 pour le troisième, à la ont un effet.

Dans mon cas, le problème était un appel à la ObjectContext.SaveChanges() dans le Cadre de l'Entité à l'intérieur d'une application console. Avec le MTAThreadAttribute appliquée à l' Main() méthode de la ContextSwitchDeadlock exception n'était plus soulevée. Je suis malheureusement pas sûr de le plein effet de ce changement.

9voto

Franci Penov Points 45358

Ce message indique que votre code tente de changer de thread et que le thread cible est occupé. Par exemple, un thread en arrière-plan essayant de distribuer un appel au thread d'interface utilisateur pour mettre à jour l'interface utilisateur, alors que l'interface utilisateur exécute une boucle étroite pendant un certain temps.

Pour comprendre réellement ce qui se passe, vous devez entrer dans le débogueur et examiner tous les fils de discussion et leur travail.

3voto

Ehsan Ershadi Points 1349

Dans certains cas :
Debug -> Exceptions -> Assistants de débogage gérés
et en décochant l'élément ContextSwitchDeadlock.

0voto

Kumari Sony Points 27

Sélectionnez simplement Exceptions dans le menu de débogage de la fenêtre de visual studio 2005, la boîte de dialogue Edxception s’affiche, sélectionnez le nœud d’exception des assistants de débogage gérés, puis sélectionnez ContextSwitchDeadlock et supprimez la colonne Sélectionner de la projection. cela empêchera le vs de lever l'exception ContextSwitchDeadlock.

J'espère que cela t'aides..

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X