The problem is that your Change call indicates that the next call should happen immediately. If you are going to call Change every time, you can simply use the Timeout.Infinite period (which is only a constant of -1) to say to avoid repeating altogether after the next time - but it will continue to fire, because the next time you reset his. For example:
using System; using System.Threading; static class Program { private static Timer timer = new Timer(TimerCallBack); public static void Main() { timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1)); Thread.Sleep(10000); } private static void TimerCallBack(object obj) { Console.WriteLine("{0}: Fired", DateTime.Now); timer.Change(TimeSpan.FromSeconds(3), TimeSpan.FromMilliseconds(Timeout.Infinite)); } }
Alternatively, you can change it only once, and then leave it:
using System; using System.Threading; static class Program { private static Timer timer = new Timer(TimerCallBack); private static bool changed = false; public static void Main() { timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1)); Thread.Sleep(10000); } private static void TimerCallBack(object obj) { Console.WriteLine("{0}: Fired", DateTime.Now); if (!changed) { changed = true; TimeSpan interval = TimeSpan.FromSeconds(3); timer.Change(interval, interval); } } }
Note that nothing uses the start interval (1 second in the above samples) anyway, because we call Change immediately - if you really want a different time before the first call, do not use TimeSpan.Zero in the Change start call.
Jon skeet
source share