2010-02-08 3 views
5

J'ai un programme que je dirige et au milieu que je reçois ce message:un message étrange sur les threads en C#

Managed Debugging Assistant 'ContextSwitchDeadlock' a détecté un problème dans « C: \ Documents and Settings \ Lena G \ Mes documents \ SchoolStuff \ Information IR \ Travail à domicile \ FianlProject \ finalProject \ finalProject \ bin \ Debug \ finalProject.vshost.exe '. Informations supplémentaires: Le CLR n'a pas pu passer du contexte COM 0x3407968 au contexte COM 0x3407ad8 pendant 60 secondes. Le thread qui possède le contexte/appartement de destination est probablement en train de faire une attente sans pompage ou de traiter une opération très longue sans pomper les messages Windows. Cette situation a généralement un impact négatif sur les performances et peut même conduire à une non-réactivité de l'application ou à une accumulation continue de l'utilisation de la mémoire au fil du temps. Pour éviter ce problème, tous les threads STA (single threaded apartment) doivent utiliser des primitives d'attente de pompage (telles que CoWaitForMultipleHandles) et pomper régulièrement des messages lors d'opérations longues. Je comprends que cela a quelque chose à voir avec le fait qu'il fonctionne pendant 60 secondes sans s'arrêter ou quelque chose comme ça? Comment est-ce un problème? Je mets également [STAThread] avant le principal de mon programme parce que si je le supprime puis il me montre ce message:

Une exception non gérée de type "System.Threading.ThreadStateException" s'est produite dans System.Windows.Forms.dll Informations supplémentaires: Le thread en cours doit être défini sur le mode STA (Single Thread Apartment) avant que les appels OLE puissent être effectués. Assurez-vous que votre fonction Main a STAThreadAttribute marqué dessus. Cette exception n'est levée que si un débogueur est attaché au processus.

Quelqu'un sait comment je peux résoudre ce problème?

Merci à l'avance,

Lena

Répondre

1

Il s'agit d'un avertissement généré lorsque vous effectuez des appels sur un objet ActiveX à partir d'un thread d'arrière-plan et que votre thread principal est bloqué. Peut-être plus probable: il y avait un bug dans la version commerciale de Visual Studio 2005 qui a déclenché cet avertissement sans raison valable. Il a été corrigé dans le Service Pack 1, assurez-vous que vous l'avez installé. Une autre solution consiste à le fermer. Déboguer + Exceptions, Assistants de débogage gérés, décochez l'avertissement ContextSwitchDeadlock. Mais utilisez SP1 si vous ne l'avez pas.

+0

Si je désactive le blocage du contexte, est-ce que cela peut faire du tort? J'utilise Visual Studio 2008 .. –

+0

Rien ne va exploser. Vous pourriez avoir une impasse. Vous le découvrirez assez vite, votre programme va geler. –

2

Vous devez vous assurer que votre fil qui est propriétaire du composant COM n'est pas « verrouillé » par le traitement pendant> 60 secondes.

Ce qui se passe probablement, c'est que vous avez un objet COM dans un formulaire, et que vous travaillez sur le thread de l'interface utilisateur. Si votre interface utilisateur est bloquée par le traitement pendant> 60 secondes, le composant COM peut se plaindre. Vous pouvez utiliser l'instance BackgroundWorker pour gérer votre processus de longue durée. Cela entraînerait le travail sur un thread d'arrière-plan et permettrait au composant COM de traiter les messages sans se plaindre.