L'une des formulaires Windows de notre société a eu un problème étrange pendant plusieurs mois. L'application a travaillé très fiable pour la plupart de nos clients, mais sur certains PC (surtout avec une connexion LAN sans fil), l'application n'a plus jamais répondu. (Vous cliquez sur l'interface utilisateur et Windows vous demandez d'attendre ou de tuer l'application).
Je n'ai pas été capable de suivre le problème pendant une longue période, mais maintenant, j'ai compris ce qui se passe.
L'application avait cette ligne de code P> et utilisé des filets de fond pour modifier les commandes. P> Non, j'ai trouvé un moyen de reproduire l'application de la demande de réponse bug sur ma machine de développement et le suivi vers une ligne où j'utilisais réellement appelé () pour exécuter une tâche dans le fil principal. P> Control.CheckForIllegalCrossThreadCalls = false
3 Réponses :
Il y a un algorithme pour trouver des blocages. Regardez ces résultats Google: http://www.google.be/search?hl=fr&client=safari&rls=fr&q=deadlock+Détection+algorithm&revid=1345706645&sa=x&ei=zqsstpbmj4qy0gtvtowfcg&ved=0cd4q1qioaa P>
Peut-être que cela pourrait vous aider: http://www.debuginspector.com/index.htm a> p>
C'est une extension de studio visuelle qui vous permet de suivre les impasses et qu'il a une bande d'autres fonctions Nifty pour le débogage des threads (comme la visualisation de la piqûre de filetage multiple sans aller à la fenêtre de threads). P>
Vous avez plus que ce qui est probablement identifié le coupable correctement, régler CheckforillegalCrossThreadCalls à Faux est un excellent moyen de créer une impasse aléatoire. La seule raison pour laquelle la propriété existe même est d'autoriser les programmes de débogage de Borked .NET 1.X. P>
Pour résoudre le dépannage, vous devez utiliser la fenêtre de débogage + Windows + Windows + pour basculer entre les différents threads et examinez leurs piles d'appel. Mais compte tenu de la nature probable de la source, cela va être difficile puisqu'il s'agit d'un code non géré probable qui fait quelque chose avec la file d'attente de messagerie ou SendMessage (). Code que vous n'avez pas écrit et n'avez pas de code source ni de débogage des symboles pour. Ils ont également tendance à être aléatoires, la prochaine fois que les blocages informatiques peuvent sembler complètement différents. P>
Windows sont des objets fondamentalement thread-dangereux. Ils ont une très grande quantité d'état associé à eux. Non seulement dans les emballages de classe Windows Formulaires, à l'intérieur de Windows lui-même. Je fais confiance à vous résolu le problème. P>
Je viens de faire face à une autre impasse avec 2 fil accédant à l'objet de la même connexion MySQL (ce n'est pas une bonne idée, je sais) et avec débogage -> Windows -> threads, je pouvais comprendre ce qui s'est passé exactement et comment l'éviter dans une scission seconde. Merci beaucoup.