2008-08-01 6 views
75

Je suis conscient que dans .NET il existe trois types de minuterie (voir Comparing the Timer Classes in the .NET Framework Class Library). J'ai choisi une minuterie filetée car les autres types peuvent dériver si le thread principal est occupé, et j'ai besoin de cela pour être fiable.Minuterie fiable dans une application console

La façon dont cette minuterie fonctionne dans le contrôle de la minuterie est mis sur un autre fil de sorte qu'il peut toujours cocher avec le travail commence terminé sur le fil parent quand il n'est pas occupé. Le problème avec ce temporisateur dans une application de console est que pendant que le temporisateur tourne sur un autre thread, le thread principal ne fait rien pour que l'application se ferme.

J'ai essayé d'ajouter une boucle while true, mais le fil principal est trop occupé lorsque la minuterie s'éteint.

Répondre

48

Vous pouvez utiliser quelque chose comme Console.ReadLine() pour bloquer le thread principal, de sorte que les autres threads d'arrière-plan (comme les threads minuterie) continueront à fonctionner. Vous pouvez également utiliser un AutoResetEvent pour bloquer l'exécution, puis (lorsque vous en avez besoin), vous pouvez appeler la méthode Set() sur cet objet AutoResetEvent pour libérer le thread principal. Assurez-vous également que votre référence à l'objet Timer ne sort pas de sa portée et qu'elle n'est pas collectée.

15

Envisagez d'utiliser un ManualResetEvent pour bloquer le thread principal à la fin de son traitement et appelez le Reset() dès que le traitement de la temporisation est terminé. Si cela doit toujours être exécuté, envisagez de le déplacer dans un processus de service au lieu d'une application de console.

Questions connexes