为什么.NET 中有5个 Timer 类的版本?

为什么.Net 框架中有五个计时器类,即:

  1. System.Timers.Timer
  2. System.Threading.Timer
  3. System.Windows.Forms.Timer
  4. System.Web.UI.Timer
  5. System.Windows.Threading.DispatcherTimer

为什么 Timer 类有几个版本? 它们之间有什么区别?

33275 次浏览

Timers.Timer generates an event after a set interval, with an option to generate recurring events. MSDN

Windows.Forms.Timer is a Control for winforms.

Web.UI.Timer performs asynchronous or synchronous Web page postbacks at a defined interval. MSDN

Threading.Timer is the timer for Callbacks. Creates a new Thread for working. Served by thread pool threads. MSDN

So, these timers have different purposes, also they are served by different tools.

Here's a description of the primary timers and the points that i find to be the most noteworthy.

Winforms.Timer

  • ticks on UI thread
  • ticks delayed until UI thread is idle
  • will skip ticks if the UI thread is busy long enough for multiple ticks to pile up

DispatcherTimer

  • invoked on UI thread
  • can set priority for what level of 'idle' is required to generate a tick
  • will skip ticks if they pile up

Threading.Timer

  • ticks on a worker thread from threadpool - no option for specifying thread
  • ticks are always fired on time
  • none are skipped - you must guard against new ticks while you're still processing a former tick
  • unhandled exceptions will crash the application

Timers.Timer

  • wrapper around threading timer
  • ticks on a worker thread taken from the CLR threadpool
  • can force to tick on a specific thread by supplying a SynchronizationObject
  • ticks are always fired on time
  • none are skipped
  • silently eats exceptions

This question is now answered by Microsoft in the MSDN article for system.timers.timer

https://learn.microsoft.com/en-us/dotnet/api/system.timers.timer?view=net-5.0

Tip

Be aware that .NET includes four classes named Timer, each of which offers different functionality:

System.Timers.Timer (this topic): fires an event at regular intervals. The class is intended for use as a server-based or service component in a multithreaded environment; it has no user interface and is not visible at runtime.

System.Threading.Timer: executes a single callback method on a thread pool thread at regular intervals. The callback method is defined when the timer is instantiated and cannot be changed. Like the System.Timers.Timer class, this class is intended for use as a server-based or service component in a multithreaded environment; it has no user interface and is not visible at runtime.

System.Windows.Forms.Timer (.NET Framework only): a Windows Forms component that fires an event at regular intervals. The component has no user interface and is designed for use in a single-threaded environment.

System.Web.UI.Timer (.NET Framework only): an ASP.NET component that performs asynchronous or synchronous web page postbacks at a regular interval.