I have been checking out some of the possible timers lately, and the Threading.Timer and Timers.Timer are the ones that look needful to me (since they support thread pooling).
I am making a game, and I plan on using all types of events, with different intervals, etc.
Which would be the best?
Information from Microsoft about this (see Remarks on MSDN):
It is interesting to mention that
System.Timers.Timer
was deprecated with .NET Core 1.0, but was implemented again in .NET Core 2.0 (/ .NET Standard 2.0). The goal with .NET Standard 2.0 was that it should be as easy as possible to switch from the .NET Framework which is probably the reason it came back.When it was deprecated, the .NET Portability Analyzer Visual Studio Add-In recommended to use
System.Threading.Timer
instead.Looks like that Microsoft favors
System.Threading.Timer
beforeSystem.Timers.Timer
.EDIT NOTE 2018-11-15: I hand to change my answer since the old information about .NET Core 1.0 was not valid anymore.
System.Threading.Timer
is a plain timer. It calls you back on a thread pool thread (from the worker pool).System.Timers.Timer
is aSystem.ComponentModel.Component
that wraps aSystem.Threading.Timer
, and provides some additional features used for dispatching on a particular thread.System.Windows.Forms.Timer
instead wraps a native message-only-HWND and uses Window Timers to raise events in that HWNDs message loop.If your app has no UI, and you want the most light-weight and general-purpose .Net timer possible, (because you are happy figuring out your own threading/dispatching) then
System.Threading.Timer
is as good as it gets in the framework.I'm not fully clear what the supposed 'not thread safe' issues with
System.Threading.Timer
are. Perhaps it is just same as asked in this question: Thread-safety of System.Timers.Timer vs System.Threading.Timer, or perhaps everyone just means that:it's easy to write race conditions when you're using timers. E.g. see this question: Timer (System.Threading) thread safety
re-entrancy of timer notifications, where your timer event can trigger and call you back a second time before you finish processing the first event. E.g. see this question: Thread-safe execution using System.Threading.Timer and Monitor
In his book "CLR Via C#", Jeff Ritcher discourages using
System.Timers.Timer
, this timer is derived fromSystem.ComponentModel.Component
, allowing it to be used in design surface of Visual Studio. So that it would be only useful if you want a timer on a design surface.He prefers to use
System.Threading.Timer
for background tasks on a thread pool thread.From MSDN:
System.Threading.Timer
is a simple, lightweight timer that uses callback methods and is served by thread pool threads. It is not recommended for use with Windows Forms, because its callbacks do not occur on the user interface thread.System.Windows.Forms.Timer
is a better choice for use with Windows Forms. For server-based timer functionality, you might consider usingSystem.Timers.Timer
, which raises events and has additional features.Source
One important difference not mentioned above which might catch you out is that
System.Timers.Timer
silently swallows exceptions, whereasSystem.Threading.Timer
doesn't.For example:
vs
I found a short comparison from MSDN