2010-10-14 3 views
7

Combien de temps les minuteurs génèrent-ils dans une application s'ils s'exécutent en arrière-plan en continu (quel que soit l'intervalle)? Je ne m'inquiète pas des appels que la minuterie fera quand elle se déclenche, mais plutôt des effets de performance de l'utilisation des minuteurs dans les applications où la performance est de la plus haute importance et je suis curieux d'entendre ce que les vues sont sur ce .Surcharge du temporisateur dans l'application C#

+0

Il y a-t-il des types d'heures dans .net http://msdn.microsoft.com/en-us/magazine/cc164015.aspx dont vous parlez? – Andrey

+0

Eh bien, je parlais des minuteurs en général - mais l'application en cours où j'étais le plus concerné est une application Silverlight, donc j'utiliserais le DispatcherTimer. Merci – Madeleine

Répondre

8

La minuterie, entre ses tics, ajoute un coût extrêmement faible à l'application. Il utilise le mécanisme du système d'exploitation pour la planification (qui est active quelles que soient vos actions), par opposition au concept intuitif d'interrogation constante de l'horloge du système. Fondamentalement, à part l'ajout de données additionnelles de mémoire et de changement de contexte (ajouts mineurs dans ce cas, il ne devrait pas y avoir plus qu'ajouter un bouton à votre formulaire) il ne devrait plus y avoir de surcharge.

+1

Quand il s'agit de minuteries et de threads, "pooling" et "polling" sont deux mots différents que l'on devrait faire attention à épeler correctement;) – d7samurai

+0

Oups! Ma faute. Merci, @ d7samurai. – Neowizard

+0

Le "mécanisme d'ordonnancement du système d'exploitation" que vous mentionnez est appelé [** boucle de messages **] (https://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows) qui met en file d'attente les messages. L'application a une boucle d'événement qui reçoit des messages de cette file d'attente de messages. – BornToCode

0

L'événement invoqué par le temporisateur s'exécutera dans le même thread auquel appartient le temporisateur et bloquera donc ce thread lors de l'exécution de toute logique. Cela signifie que si le temporisateur appartient à la couche GUI, l'exécution de la méthode Timer.Tick verrouillera l'interface graphique pendant son exécution.

Pour maintenir les performances dans le thread principal, je suggère d'utiliser un BackgroundWorker à la place qui fonctionne dans son propre thread.

+0

Il ya il types de fois dans .net http://msdn.microsoft.com/en-us/magazine/cc164015.aspx dont vous parlez? – Andrey

+0

Je faisais référence à System.Windows.Forms.Timer avec ma déclaration ci-dessus. –

0

Pour répondre de la même manière: les temporisateurs sont inestimables pour la programmation gui, mais sont pratiquement inutiles pour les tâches hautes performances. Quelques problèmes avec minuteries:

  • ils ne sont pas régulièrement à la milliseconde (en fait dans les fenêtres, rien est) - il se déclenche quand est son temps, mais quand tous les autres messages (événements-clavier de la souris, les mises à jour de contrôle) sont traitées, car il est sérialisé avec d'autres messages de/à
  • gui ne savent pas la mise en œuvre de .net, mais ils gaspillés poignées mfc

Si vous envisagez un autre thread pour une opération, assurez-vous que vous ne touchez aucun composant gui de celui-ci. Utilisez Invoke() ou copiez des mises à jour pour un gui dans une file d'attente, puis supprimez-le avec le timer du thread principal gui.