7
votes

Comment savoir où se passe une serrure de thread?

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> xxx pré>

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


0 commentaires

3 Réponses :


1
votes


1
votes

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.

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.

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.


1 commentaires

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.