J'ai reçu un message d'erreur que je ne peux pas résoudre. Il provient de Visual Studio ou du débogueur. Je ne sais pas si la condition d'erreur ultime se trouve dans VS, le débogueur, mon programme ou la base de données.
Ceci est une application Windows. Pas une application Web.
Le premier message de VS est une fenêtre contextuelle disant: "Aucun symbole n'est chargé pour aucune trame de pile d'appels. Le code source ne peut pas être affiché." Quand cela est cliqué, j'obtiens: " ContextSwitchDeadlock a été détecté ", avec un long message reproduit ci-dessous.
L'erreur survient dans une boucle qui analyse un DataTable. Pour chaque ligne, il utilise une valeur de clé (HIC #) de la table comme paramètre pour un SqlCommand. La commande est utilisée pour créer un SqlDataReader qui renvoie une ligne. Les données sont comparées. Si une erreur est détectée, une ligne est ajoutée à un deuxième DataTable.
L'erreur semble être liée à la durée d'exécution de la procédure (c'est-à-dire au bout de 60 secondes) et non au nombre d'erreurs trouvées. Je ne pense pas que ce soit un problème de mémoire. Aucune variable n'est déclarée dans la boucle. Les seuls objets créés sont les SqlDataReaders, et ils se trouvent dans Using structures. Ajouter System.GC.Collect () n'a eu aucun effet.
La base de données est un site SqlServer sur le même ordinateur portable.
Il n'y a pas de gadgets ou gadgets sophistiqués sur le formulaire.
Je ne suis au courant de rien dans ce processus qui soit très différent de ce que j'ai fait des dizaines de fois auparavant. J'ai déjà vu l'erreur, mais jamais de manière cohérente.
Des idées, quelqu'un?
Texte d'erreur complet: le CLR n'a pas pu passer du contexte COM 0x1a0b88 au contexte COM 0x1a0cf8 pendant 60 secondes. Le thread qui possède le contexte / cloisonnement de destination est très probablement en train de faire une attente sans pompage ou de traiter une opération très longue sans pompage de messages Windows. Cette situation a généralement un impact négatif sur les performances et peut même conduire l'application à devenir non réactive ou l'utilisation de la mémoire s'accumulant continuellement 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 pendant les opérations de longue durée.