web-dev-qa-db-fra.com

Comparaison de la minuterie avec DispatcherTimer

quelle est la différence between System.Windows.Forms.Timer() et System.Windows.Threading.DispatcherTimer()? Dans quels cas, devrions-nous les utiliser? des meilleures pratiques?

95
paradisonoir

Windows.Forms.Timer utilise la boucle de messages de Windows Forms pour traiter les événements du minuteur. Il doit être utilisé lors de l'écriture des événements de synchronisation utilisés dans les applications Windows Forms, et vous souhaitez que le minuteur se déclenche sur le thread d'interface utilisateur principal.

DispatcherTimer est le mécanisme de synchronisation WPF. Il doit être utilisé lorsque vous souhaitez gérer le timing de manière similaire (bien que cela ne soit pas limité à un seul thread - chaque thread a son propre répartiteur) et que vous utilisez WPF. Il déclenche l'événement sur le même thread que le répartiteur.

En général, WPF == DispatcherTimer et Windows Forms == Forms.Timer.

Cela étant dit, il y a aussi System.Threading.Timer , qui est un minuteur class qui se déclenche sur un thread séparé. C'est bon pour le chronométrage purement numérique, où vous n'essayez pas de mettre à jour l'interface utilisateur, etc.

109
Reed Copsey

J'ai trouvé un bon article sur les minuteries avec de petits exemples ici: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

Comme conclusion:

Si DoSomething () manipule des composants GUI, alors avec le Timer vous devez utiliser: this.Dispatcher.Invoke ((Action) délégué {// GUI RELATED ICI} puisque vous ne pouvez pas accéder directement aux contrôles GUI depuis un autre thread. Avec DispatcherTimer vous le faites pas besoin de faire ça.

Si DoSomething () effectue une tâche qui prend du temps, l'interface graphique se fige dans le cas du DispatcherTimer. Dans le cas du Timer, ce ne sera pas le cas car le long méthos est exécuté dans un thread différent

4
Seekeer