2010-08-04 5 views
3

Comment déclencher un événement de minuteur un à la fois. Par exemple, j'ai une minuterie qui déclenche un événement toutes les 10 minutes. L'événement déclenché prend 10 minutes ou plus pour terminer l'exécution. Je voudrais que la minuterie se réinitialise APRÈS que l'événement est terminé. En d'autres termes, je ne veux pas déclencher plus d'une instance de l'événement à un moment donné.Comment élever seulement 1 événement Timer en C#?

Répondre

6

Habituellement ce que je fais est d'avoir mon événement arrêter le chronomètre quand il est relevé et puis redémarrez le chronomètre lorsque le processus d'événement terminé:

private void timerHandler(object sender, TimerElapsedEventArgs e) 
{ 
    Timer timer = (Timer)sender; 
    timer.Stop(); 
    RunProcess(); 
    timer.Start(); 
} 

public void RunProcess() 
{ 
    /* Do stuff that takes longer than my timer interval */ 
} 

Maintenant, ma minuterie repartira à la fin du processus

+1

Est-ce pas introduisons une condition de course (http://msdn.microsoft.com/en-us/library/system.timers.timer.stop.aspx) qui est pas un problème avec la solution AutoReset ? – Jon

14

Utiliser System.Timers.Timer pas le Threading

Définissez AutoReset sur false.

Puis recommencez lorsque vous avez terminé.

+0

+1 pour 'MyTimer.AutoReset = false'. Sinon, quelqu'un pourrait oublier de gérer manuellement les appels 'Start()' et 'Stop()'. –

+2

Je ne comprends pas pourquoi Stop/Start manuel a obtenu plus de votes –

0

Il peut être difficile d'arrêter les compteurs pour des raisons d'efficacité ou de logique. Le code suivant se synchronise en ignorant les événements.

static readonly object key = new object(); 

void TimerHandler(object sender, TimerElapsedEventArgs e) 
{ 
    if(Monitor.TryEnter(key)) 
    { 
    try 
    { 
     //do your stuff 
    } 
    finally 
    { 
     Montitor.Exit(key); 
    } 
    } 
}