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
.
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.
Je viens d'appeler le **ElapsedEventHandler**
avec des paramètres nuls.
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
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();
}
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);
}
}
Task.Run(() =>
{
Timer_Elapsed(null, null);
});
Après la création/configuration du minuteur, a bien fonctionné pour moi ...
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
.
.
.
}
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)
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.
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