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