web-dev-qa-db-fra.com

Comment déclencher immédiatement un événement timer.Elapsed

J'utilise la classe System.Timers.Timer pour créer une minuterie avec un événement Timer.Elapsed. La chose est que l'événement Timer.Elapsed est déclenché pour la première fois seulement après la fin de l'intervalle.

Existe-t-il un moyen de déclencher l'événement Timer.Elapsed juste après le démarrage du minuteur?

Je n'ai trouvé aucune propriété pertinente dans la classe System.Timers.Timer .

47
Otiel

Appelez simplement la méthode Timer_Tick vous-même.


Si vous ne souhaitez pas traiter les paramètres de la méthode de rappel Tick, insérez simplement le code qui se trouvait dans votre Timer_Tick dans une autre méthode et appelez-le à partir du Timer_Tick et juste après l'appel Timer.Start()


Comme l'a souligné @Yahia, vous pouvez également utiliser le System.Threading.Timer timer, que vous pouvez définir pour que le délai initial soit 0. Sachez cependant que le rappel s'exécutera sur un autre thread, par opposition le rappel sur le Windows.Forms.Timer qui s'exécute sur le thread d'interface utilisateur. Donc, si vous mettez à jour des contrôles de l'interface utilisateur à l'aide de System.Threading.Timer (sans invoquer correctement), cela plantera.

28
George Duckett

Je viens d'appeler le **ElapsedEventHandler** avec des paramètres nuls.

18
user1791983

pas sûr de System.Timers.Timer mais essayez

System.Threading.Timer T = new System.Threading.Timer(new TimerCallback(DoSomething), null, 0, 30000);

Cela commence immédiatement (0 millisecondes pour la première exécution, 30000 millisecondes pour les exécutions ultérieures) ...

voir
http://msdn.Microsoft.com/en-us/library/system.threading.timer.aspx
http://msdn.Microsoft.com/en-us/library/2x96zfy7.aspx

10
Yahia

Je sais que cette réponse est en retard, mais si vous souhaitez que votre System.Timers.Timer soit déclenché dans un délai de 100 ms (intervalle par défaut), vous pouvez simplement initialiser l'objet Timer sans intervalle spécifié, puis définir l'intervalle dans la fonction appelée comme bon vous semble. Voici un exemple de ce que j'utilise dans mon service Windows:

private static Timer _timer;

protected override void OnStart(string[] args)
{
    _timer = new Timer(); //This will set the default interval
    _timer.AutoReset = false;
    _timer.Elapsed = OnTimer;
    _timer.Start();
}

private void OnTimer(object sender, ElapsedEventArgs args)
{
    //Do some work here
    _timer.Stop();
    _timer.Interval = 50000; //Set your new interval here
    _timer.Start();
}
9
John Odom

Si vous voulez pouvoir déclencher l'événement quand vous le souhaitez (pas seulement au moment où vous démarrez le chronomètre), vous pouvez encapsuler un chronomètre dans votre propre classe MyTimer. Cette classe expose les méthodes et propriétés du minuteur d'origine. De plus, j'ai ajouté un événement avec des ajouts et des suppressions explicites. De cette manière, chaque fois que vous ajoutez un délégué à l'événement, celui-ci est ajouté à la fois à l'événement privé de MyTimer et à l'événement de minuterie écoulé d'origine. Cela signifie que le chronomètre se déclenche normalement, mais vous pouvez déclencher manuellement l'événement appelé RaiseElapsed (cela devrait sembler beaucoup plus simple si vous regardez le code).

public class MyTimer
{
    Timer t = new Timer();
    event ElapsedEventHandler timerElapsed;

    public event ElapsedEventHandler Elapsed
    {
        add
        {
            t.Elapsed += value;
            timerElapsed += value;
        }
        remove
        {
            t.Elapsed -= value;
            timerElapsed -= value;
        }
    }

    public double Interval
    {
        get
        {
            return t.Interval;
        }
        set
        {
            t.Interval = value;
        }
    }

    public void Start()
    {
        t.Start();
    }

    public void Stop()
    {
        t.Stop();
    }

    public void RaiseElapsed()
    {
        if (timerElapsed != null)
            timerElapsed(null, null);
    }
}
4

Task.Run(() => { Timer_Elapsed(null, null); });

Après la création/configuration du minuteur, a bien fonctionné pour moi ...

3
ADNnetPonzo

Pour la première fois, le chronomètre démarrera après 1 seconde. Après cela, son intervalle sera changé toutes les 30 secondes ou peu importe ...

    //main function    
    Timer timer = new Timer(1000);   //initial start after 1 second
        timer.Elapsed += new ElapsedEventHandler(TimerElapsedMethod);
        timer.Start();            
    }
    private void TimerElapsedMethod(object sender, ElapsedEventArgs e) 
    {
        Timer timer = (Timer)sender; // Get the timer that fired the event
        timer.Interval = 30000;      // Change the interval to whatever
        .
        .
        .
    }
2
Hamad

Voici la réponse facile. (En supposant que vous utilisez un formulaire Windows)

Après avoir fait glisser votre contrôle timer sur votre formulaire, définissez la propriété enabled sur true et la propriété Interval sur la valeur initiale souhaitée. (100 est la valeur par défaut et va immédiatement déclencher l'événement tick)

 enter image description here

Ensuite, dans votre événement tick, vérifiez simplement la valeur de la propriété Interval. Si ce n'est pas votre valeur souhaitée, définissez-la. C'est si simple. La même chose peut être accomplie dans votre code C # si vous créez une minuterie à la volée.

 enter image description here

0
puffgroovy

J'ai implémenté dans VB.NET avec AddHandler

Public Class clsMain Inherits ServiceBase

Protected Overrides Sub OnStart(ByVal args() As String)
' Add code here to start your service. This method should set things
' in motion so your service can do its work.
gTimer.Interval = 1000  
gTimer.Enabled = True
AddHandler gTimer.Elapsed, AddressOf gTimer_Elapsed
End Sub

'When the timer is elapsed this event will be fired

Protected Sub gtimer_Elapsed(ByVal source As Object, ByVal e As ElapsedEventArgs)
'Stop the timer and do some work
gTimer.Stop()
'Custom code
'Here
'Start to raise the elapsed event again
gTimer.Start()
End Sub
End Class
0
developer9