2010-09-11 12 views
7

J'ajoute des boutons pour former avec une boucle et j'ai remarqué que l'ajout de gestionnaires d'événements click ralentissait trop l'application. Plus tard, j'ai essayé l'événement de clic de souris à la place cliquez sur l'événement et il fonctionne instantanément.Pourquoi l'événement Winforms Click est-il plus lent que l'événement MouseClick?

Cette capture d'écran montrant le résultat de mon test: alt text code source: http://pastebin.com/qVewNm1u

Résultats pour gestionnaire d'événements 1000:
Clics: 2892ms MouseClick: 1ms

Je ne peux pas comprendre pourquoi Cliquez sur l'événement très lent.

Edit: Si je change construire la cible de plate-forme pour x64 ou Any CPU, les résultats changer: Clics: 5, MouseClick: 9 Regardez comme objectif de la plate-forme x86 l'origine de ce problème, mais encore des résultats x64 pas de bons trop par rapport à x86 MouseClick temps (1ms).

Edit2: J'ai changé de capture d'écran maintenant il va montrer un meilleur résultat.

Edit3: https://connect.microsoft.com/VisualStudio/feedback/details/597039/winforms-click-event-slower-than-the-mouseclick-event

Répondre

5

Je repro, mais il est spécifique à VS2010. Il n'y a pas de tel comportement dans VS2008, les deux s'exécutent en moins de 1 tick. Cela ne dépend pas non plus de la version .NET.

Cela ressemble à un défaut dans IntelliTrace, disponible dans l'édition Ultimate. Essayer de creuser plus profond et de tourner le débogage de code non managé sur enlevé l'effet. Projet + Propriétés, onglet Déboguer, cochez "Activer le débogage de code non géré".En outre, l'exécution du programme sans le débogueur (Ctrl + F5) a supprimé l'effet. Le slam-dunk est Outils + Options, IntelliTrace, Général, décocher Activer pour supprimer l'effet.

Je vous recommande d'envoyer vos résultats à connect.microsoft.com. Vous pouvez référencer ce fil dans votre rapport de commentaires. Tout ce qu'ils doivent savoir pour diagnostiquer le problème est disponible.

Comme indiqué, la solution de contournement consiste à désactiver IntelliTrace. Ceci est garanti pour ne pas être un problème sur la machine de votre client.

+0

Après désactiver IntelliTrace maintenant chaque fois 0ms résultats. Merci pour l'aide. Je posterai un rapport de bug dans connect.microsoft.com – Jaex

+0

Excellent travail de détective, Hans! – Robaticus

0

Avez-vous essayé de créer les boutons d'abord, avant de mesurer l'attachement du gestionnaire d'événements?

Il y a au moins deux inconnues ici: 1) l'heure d'exécution du constructeur du bouton, et 2) l'abonnement au gestionnaire d'événements.

Mise à jour: J'ai essayé de reproduire le problème mais j'ai toujours 4ms-6ms pour les deux tests. Le test est-il toujours plus lent, ou est-ce arrivé une seule fois? Parfois, des choses étranges se produisent avec jitting et GCing qui ne sont pas toujours déterministes à 100%.

+0

J'ai été capable de dupliquer ses résultats. Je vais avoir 4000+ ms pour le premier et 1ms pour le second. – Robaticus

+0

Dans mon projet réel j'ai créé des boutons en premier et seulement cliquez sur l'abonnement gestionnaire d'événements très lent. C'est donner à chaque fois les mêmes résultats. Maintenant, j'ai essayé de construire x64 et les résultats très intéressants: Cliquez sur: 3 MouseClick: 25 Regardez comme x84 build causant ce problème dans mon os w7 64bit. – Jaex

0

Bien que je ne puisse pas vous dire ce qui se passe, il existe un certain nombre de problèmes avec votre suite de tests. Tout d'abord, vous devriez probablement arrêter la minuterie avant de faire la Console.WriteLine, puisque vous mesurez maintenant combien de temps il faut pour créer la chaîne utilisée dans WriteLine. Deuxièmement, vous pouvez créer les boutons avant de démarrer le minuteur, car vous mesurez également le temps de création du bouton, qui inclut la pile, le tas, la récupération de place et d'autres problèmes potentiels. Je suggère d'allouer les boutons à un tableau, puis d'affecter les gestionnaires pairs aux éléments après le démarrage du chronomètre.

+0

'ElapsedMilliseconds' sera appelé avant que n'importe quel truc de la console n'arrive. – leppie

+0

Je n'ai pas dit ça. Relis ce que j'ai dit. –

+0

Même résultat: http://img841.imageshack.us/img841/9932/ss20100911064602.png – Jaex

0

Je ne suis pas sûr car je n'ai qu'un petit 4ms pour ClickTest(). Cependant, j'ai changé le code pour cela et le temps 4ms est parti.

EventHandler d = new EventHandler(Form1_Click); 
for (int i = 0; i < buttons.Length; i++) buttons[i].Click += d; 

Le code dans la boucle que vous avez écrit équivalent à button[i].Click += new EventHander(Form_Click), qui créent nouvelle instance de délégué à chaque itération.

+0

Cela résout mon problème pour la construction x64, maintenant c'est 0ms mais rien n'a changé pour la construction de x86 il est encore 2900ms. Quelle est votre plate-forme de construction? Parce que ce problème se produit uniquement lorsque la plate-forme de construction est x64. Besoin d'un système d'exploitation 64 bits pour le test. – Jaex

+0

J'ai oublié de mentionner que le temps 4ms s'est produit seulement sur la construction x86 sur ma machine. Le résultat de x64 et Any APU build sont toujours 0ms. Je cours Windows 7 x64, Visual Studio 2008 et .Net Framework 3.5 SP1. – tia