Minuterie fiable dans une application console

103

Je suis conscient que dans .NET, il existe trois types de minuterie (voir Comparaison des classes de minuterie dans la bibliothèque de classes .NET Framework ). J'ai choisi une minuterie filetée car les autres types peuvent dériver si le thread principal est occupé, et j'en ai besoin pour être fiable.

La façon dont cette minuterie fonctionne dans le contrôle de la minuterie est placée sur un autre thread afin qu'il puisse toujours cocher avec le début du travail terminé sur le thread parent lorsqu'il n'est pas occupé.

Le problème avec ce minuteur dans une application console est que pendant que le minuteur tourne sur un autre thread, le thread principal ne fait rien à l'application se ferme.

J'ai essayé d'ajouter une while trueboucle, mais le fil principal est trop occupé lorsque la minuterie se déclenche.

John
la source

Réponses:

59

Vous pouvez utiliser quelque chose comme Console.ReadLine()pour bloquer le thread principal, afin que les autres threads d'arrière-plan (comme les threads de minuterie) fonctionnent toujours. 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 n'est pas hors de portée et n'est pas récupérée.

Huseyint
la source
20

Envisagez d'utiliser un ManualResetEvent pour bloquer le thread principal à la fin de son traitement et appelez- Reset()le une fois le traitement du minuteur terminé. Si c'est quelque chose qui doit s'exécuter en continu, envisagez de le déplacer dans un processus de service au lieu d'une application console.

Greg Hurlman
la source