There's a great article on msdn that covers the 3 different types of timers. I've basically boiled it down to this:
- Use the Forms.Timer for simple updates to the UI. For example i like to bold certain errors when they happen and then return them to a normal font. This helps the user identify when they caused the same error twice.
- Use the Threading.Timer to execute one-off processes off of the UI thread
- Use the Timers.Timer to execute recurring processes. This timer's AutoReset and Enabled properties make it much cleaner to use than Threading.Timer's Change method.
I tended to lean to Threading.Timer in most cases. When I needed to do something on the UI thread i just used Invoke. What I missed from the article is Timers.Timer's SynchronizingObject property. Simply set this to your form or something else on your UI thread, and no "InvokeRequired" code is needed to access the UI. Because of this, this timer has no become my timer of choice. The only drawback to it compared to the Threading version, is that the Threading version's callback takes an object parameter allowing you to pass some state into the callback. That's only a minor issue considering you can either create a field to temporarily store this additional data or you can create different "Elapsed" events.
Some other basic threading tips:
- Don't forget to hold a reference somewhere to your timer. If there are no references, the timer might be garbage collected before it gets a chance to fire
- Timers.Timer AutoReset is true by default. I almost always set this to false and then reset Enabled=true in the Elapsed event. This avoids any reenterance issues.