There are three kinds of timers in .Net but it’s not always obvious when to use which one. Here’s some sample code of each, and then later on a table from the MSDN website that summarizes the differences.
// Runs on the UI thread // Will not raise events if UI is unable to process them
private void RunTimer()
{
//Create System.Windows.Forms.Timer
System.Windows.Forms.Timer myTimer =
new System.Windows.Forms.Timer();
//Set the timer interval in milliseconds myTimer.Interval = 2000; myTimer.Tick += new EventHandler(myTimerTick); myTimer.Start();
//Run the timer for 10 seconds System.Threading.Thread.Sleep(10000);
myTimer.Stop();
}
void myTimer_Tick(object sender, EventArgs e)
{
//Do something useful here
System.Threading.Thread.Sleep(1000);
}
//Thread-safe //Will run Elapsed event on a thread from thread pool
private void RunTimer2()
{
//Create System.Timers.Timer
System.Timers.Timer myTimer =
new System.Timers.Timer();
//Set the timer interval in milliseconds
myTimer.Interval = 2000;
//What to do when the timer expires myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed); myTimer.Start();
}
void myTimer_Elapsed(object sender,
System.Timers.ElapsedEventArgs e)
{
//The timer has expired - do something
}
//Not thread safe - but you can use it in a //thread safe way //Runs on a worker thread
private void RunTimer3()
{
System.Threading.Timer myTimer =
new System.Threading.Timer(TimerCallback, null,
5000, System.Threading.Timeout.Infinite);
}
private void TimerCallback(object o)
{
//The timer has expired - do something
}
| System.Windows.Forms | System.Timers | System.Threading | |
| Timer event runs on what thread? | UI thread | UI or worker thread | Worker thread |
| Instances are thread safe? | No | Yes | No |
| Familiar/intuitive object model? | Yes | Yes | No |
| Requires Windows Forms? | Yes | No | No |
| Metronome-quality beat? | No | Yes* | Yes* |
| Timer event supports state object? | No | No | Yes |
| Initial timer event can be scheduled? | No | No | Yes |
| Class supports inheritance? | Yes | Yes | No |
| * Depending on the availability of system resources (for example, worker threads) | |||