2009-01-24 8 views
1

Nous avons une application contenant un grand nombre de contrôles utilisateur qui se mettent fréquemment à jour en fonction d'un System.Windows.Forms.Timer. Suis-je sûr d'ajouter une instance de Timer à chaque contrôle de manière conforme? Ou devrais-je avoir un Singleton Timer qui fonctionne tout le temps qui doit être utilisé par toutes les instances? Qu'est-ce qui se passe sous le capot? Y aura-t-il un fil supplémentaire (pour compter) pour chaque minuteur?Performance de System.Windows.Forms.Timer

Répondre

1

Il n'y a pas de fil supplémentaire. Il y a juste beaucoup de messages WM_TIMER qui arrivent dans la file d'attente des messages de votre thread. Ainsi, ces minuteurs n'exécuteront pas leur code en parallèle, même si leurs intervalles de temps se chevauchent.

Je pense que cela ne ferait pas de mal d'avoir une minuterie séparée pour le contrôle evey. Au moins, il n'aura certainement aucune différence de performance mesurable sur l'utilisation d'une seule minuterie. Le code deviendra plus lisible cependant. Btw - avec le déplacement massif d'aujourd'hui à plusieurs cœurs de processeur, considérez si ce n'est peut-être pas un endroit où vous pouvez en tirer profit.

2

System.Windows.Forms.Timer est implémenté via le bon vieux User32 Timers. En tant que tels, ils n'utilisent pas ou n'ont pas besoin d'un fil séparé pour fonctionner. Cela dit, ils sont une ressource limitée, en ce sens que vous ne pouvez pas en avoir un nombre infini.

Lorsque vous dites que vous avez un lot de contrôles utilisateur utilisant des minuteurs, que voulez-vous vraiment dire par "beaucoup"? dix? 10000?

Lorsque vous dites qu'ils se mettent à jour fréquemment, que voulez-vous vraiment dire? Chaque minute? Toutes les 100 millisecondes? Aussi vite que leurs minuteurs peuvent tirer?

Stress tester votre application. Voir combien de contrôles vous pouvez avoir actif avant qu'il ne commence à s'écraser ou devient si lent qu'il est inutilisable. Les chances sont, vous atteindrez le point où la surcharge du traitement interne pour les messages WM_TIMER tue les performances bien avant que vous manquiez d'autres ressources.

1

Les minuteurs se déclenchent-ils à différents moments pour chaque contrôle? Est-ce qu'ils ont chacun besoin d'une minuterie séparée?

Rappelez-vous que vous pouvez brancher plusieurs gestionnaires d'événements pour un événement unique, donc si vous utilisez les minuteries pour faire une animation simple, vous pourriez peut-être faire avec un événement de tir de minuterie pour de nombreux contrôles ...