c# timer - Minuterie fiable dans une application de console



elapsed utilisation (3)

Envisagez d'utiliser un ManualResetEvent pour bloquer le thread principal à la fin de son traitement et appelez Reset() une fois le traitement du timer 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.

Je suis conscient que dans .NET il existe trois types de minuteur (voir Comparaison des classes de minuteur 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'ai besoin de cela pour être fiable.

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 while, mais le thread principal est trop occupé quand la minuterie s'éteint.


Vous pouvez utiliser quelque chose comme Console.ReadLine() pour bloquer le thread principal, ainsi les autres threads d'arrière-plan (comme les threads de 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.


@CQ: Pourquoi créez-vous une copie locale pf Jump ? De plus, vous pouvez enregistrer le test suivant en modifiant légèrement la déclaration de l'événement:

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}




c# .net vb.net timer