2010-12-31 8 views
0

J'ai une question sur les minuteurs et les fils. J'ai remarqué que les minuteurs se conduisaient mal dans les threads, alors que les minuteurs font partie du Winform.Minuteurs et multithread

Généralement, je suis intéressé par les problèmes liés aux threads et aux minuteurs.

Bonne année à vous tous, les réponses peuvent être attendre jusqu'en 2011 :)

Répondre

1

Sons comme vous utilisez un System.Threading.Timer et en utilisant un TimerCallback qui effectue des mises à jour l'interface graphique. Est-ce que c'est ça?

Il existe un certain nombre de méthodes correctes pour gérer cela. Utilisez un System.Windows.Forms.Timer et gérez son événement Tick si vous souhaitez mettre à jour l'interface utilisateur. Utilisez un BackgroundWorker, effectuez un travail non-interface utilisateur dans son événement DoWork, puis effectuez des mises à jour de l'interface utilisateur dans son événement RunWorkerCompleted si vous exécutez des tâches d'arrière-plan de longue durée. En général, la chose importante à comprendre sur le multithreading en ce qui concerne Windows Forms est la suivante: toutes les applications Windows Forms ont un thread UI, qui est le thread seulement qui est autorisé à effectuer des mises à jour de l'interface utilisateur. Il traite continuellement une file d'attente sur laquelle les actions de l'utilisateur sont poussées et gérées via des événements. Lorsque vous essayez de faire quelque chose qui met à jour un contrôle UI à partir de n'importe quel thread en dehors de ce thread, vous obtenez une exception car ce comportement n'était pas prévu dans la conception des composants Windows Forms. . L'approche du multithreading consiste donc généralement à séparer le travail en deux parties, celle qui peut être faite en arrière-plan (sur un thread non-UI) et celle qui doit être envoyée à la file en cours de traitement par le thread UI afin que il peut être manipulé de manière sûre. L'utilité des types comme System.Windows.Forms.Timer et BackgroundWorker est qu'ils encapsulent un grand nombre de détails difficiles de ce processus pour vous, vous permettant de vous concentrer sur le code que vous voulez exécuter.

C'est une vue de haut niveau de la façon dont le multithreading fonctionne avec Windows Forms. Je suis sûr que d'autres peuvent fournir beaucoup de références vous indiquant plus d'informations sur le sujet (et si personne d'autre ne le fait, peut-être que je peux en chercher plus tard).

+0

J'utilise System.Windows.Forms.Timer de mettre à jour l'interface utilisateur. Lorsque je clique sur le bouton, le fil commence, puis à partir de ce fil, je commence à deux minuteries, l'une coïncide chaque seconde et l'autre a un long tick. Parfois, cela fonctionne correctement, parfois il y a des erreurs. –

+0

Quand je lance le programme, timer2 est en train de cocher au démarrage de Winform ce qui est étrange car je n'ai pas encore démarré le timer dans le code. Peut-être est-ce parce que les propriétés Timer Enabled que j'ai définies comme vraies (Enabled des générations d'événements Elapsed). –

+0

La question est de savoir comment démarrer les minuteurs qui appartiennent au thread Winform, à partir d'un autre thread. –