Multithreaded Timers C# with Example
System.Threading.Timer - Simplest multithreaded timer. Contains two methods and one constructor.
Example: A timer calls the DataWrite method, which writes "multithread executed..." after ﬁve seconds have
elapsed, and then every second after that until the user presses Enter:
static void Main()
// First interval = 5000ms; subsequent intervals = 1000ms
Timer timer = new Timer (DataWrite, "multithread executed...", 5000, 1000);
timer.Dispose(); // This both stops the timer and cleans up.
static void DataWrite (object data)
// This runs on a pooled thread
Console.WriteLine (data); // Writes "multithread executed..."
Note : Will post a separate section for disposing multithreaded timers.
Change - This method can be called when you would like change the timer interval.
Timeout.Infinite - If you want to ﬁre just once. Specify this in the last argument of the constructor.
System.Timers - Another timer class provided by .NET Framework. It wraps the System.Threading.Timer.
IComponent - Allowing it to be sited in the Visual Studio’s Designer ’s component tray
Interval property instead of a Change method
Elapsed event instead of a callback delegate
Enabled property to start and stop the timer (default value = false)
Start & Stop methods in case if you get confused by Enabled property (above point)
AutoReset - for indicating a recurring event (default value = true)
SynchronizingObject property with Invoke and BeginInvoke methods for safely calling methods on WPF
elements and Windows Forms controls
Example representing all the above features:
using System.Timers; // Timers namespace rather than Threading
static void Main()
Timer timer = new Timer(); // Doesn't require any args
timer.Interval = 500;
timer.Elapsed += timer_Elapsed; // Uses an event instead of a delegate
timer.Start(); // Start the timer
timer.Stop(); // Stop the timer
timer.Start(); // Restart the timer
timer.Dispose(); // Permanently stop the timer
static void timer_Elapsed(object sender, EventArgs e)
Multithreaded timers - use the thread pool to allow a few threads to serve many timers. It means that callback
method or Elapsed event may trigger on a diﬀerent thread each time it is called.
Elapsed - this event always ﬁres on time —regardless of whether the previous Elapsed event ﬁnished executing.
Because of this, callbacks or event handlers must be thread-safe. The accuracy of multithreaded timers depends on
the OS, and is typically in the 10 –20 ms.
interop - when ever you need greater accuracy use this and call the Windows multimedia timer. This has accuracy
down to 1 ms and it is deﬁned in winmm.dll.
timeBeginPeriod - Call this ﬁrst to inform OS that you need high timing accuracy
timeSetEvent - call this after timeBeginPeriod to start a multimedia timer.
timeKillEvent - call this when you are done, this stops the timer
timeEndPeriod - Call this to inform the OS that you no longer need high timing accuracy.
You can ﬁnd complete examples on the Internet that use the multimedia timer by searching for the keywords
dllimport winmm.dll timesetevent.