Timer
This C# class
regularly invokes code. Every several seconds or minutes, it executes a method. This is useful for monitoring the health of a program, as with diagnostics.
The System.Timers
namespace proves useful. With a Timer
, we can ensure nothing unexpected has happened. We can also run a periodic update (to do anything).
TimerExample
is a static
class
, meaning it cannot have instance members or fields. We include the System.Timers
namespace and see the Elapsed event function.
Timer
. The Elapsed event handler is called every 3 seconds. We store the Timer
as a static
field.DateTime
to a List
every 3 seconds (when the Timer
is invoked).PrintTimes
. We wait 2 seconds between calls for the demonstration—this is separate from the core timer functionality.using System; using System.Collections.Generic; using System.Timers; static class TimerExample { static Timer _timer; static List<DateTime> _results = new List<DateTime>(); public static void Start() { // Part 1: setup the timer for 3 seconds. var timer = new Timer(3000); // To add the elapsed event handler: // ... Type "_timer.Elapsed += " and press tab twice. timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); timer.Enabled = true; _timer = timer; } static void _timer_Elapsed(object sender, ElapsedEventArgs e) { // Part 2: add DateTime for each timer event. _results.Add(DateTime.Now); } public static void PrintTimes() { // Print all the recorded times from the timer. if (_results.Count > 0) { Console.WriteLine("TIMES:"); foreach (var time in _results) { Console.Write(time.ToShortTimeString() + " "); } Console.WriteLine(); } } } class Program { static void Main() { TimerExample.Start(); // Part 3: call PrintTimes every 3 seconds. while (true) { // Print results. TimerExample.PrintTimes(); // Wait 2 seconds. Console.WriteLine("WAITING"); System.Threading.Thread.Sleep(2000); } } }WAITING WAITING TIMES: 6:43 AM WAITING TIMES: 6:43 AM 6:43 AM WAITING TIMES: 6:43 AM 6:43 AM WAITING TIMES: 6:43 AM 6:43 AM 6:43 AM WAITING TIMES: 6:43 AM 6:43 AM 6:43 AM 6:43 AM WAITING TIMES: 6:43 AM 6:43 AM 6:43 AM 6:43 AM WAITING TIMES: 6:43 AM 6:43 AM 6:43 AM 6:43 AM 6:43 AM WAITING
SignalTime
Here is another Timer
example. Notice how the TimerElapsed
event is added directly—no ElapsedEventHandler
call is needed.
ElapsedEventArgs
has a SignalTime
property, which is a DateTime
struct
. This is the time the Timer
was fired.using System; using System.Timers; class Program { static void Main() { Timer timer = new Timer(200); timer.Elapsed += Timer_Elapsed; timer.Start(); while (true) { // Infinite loop. } } private static void Timer_Elapsed(object sender, ElapsedEventArgs e) { // Use SignalTime. DateTime time = e.SignalTime; Console.WriteLine("TIME: " + time); } }TIME: 4/3/2019 2:10:55 PM TIME: 4/3/2019 2:10:55 PM TIME: 4/3/2019 2:10:56 PM TIME: 4/3/2019 2:10:56 PM TIME: 4/3/2019 2:10:56 PM TIME: 4/3/2019 2:10:56 PM
Timers allocate system resources, so if you are creating a lot of them, make sure to Dispose
them. It is usually easier to just have a single static
timer instance.
Timer
in a using
-statement. It runs every 3 seconds, and its resources are cleaned up correctly at the end of the block.using System; using System.Timers; class Program { static void Main() { // Use Timer in a using-statement. // ... This ensures it is disposed correctly. using (Timer timer = new Timer()) { timer.Interval = 1000; timer.Elapsed += Timer_Elapsed; timer.Start(); System.Threading.Thread.Sleep(10000); } } private static void Timer_Elapsed(object sender, ElapsedEventArgs e) { Console.WriteLine("ONE SECOND PASSED"); } }ONE SECOND PASSED ONE SECOND PASSED ONE SECOND PASSED ONE SECOND PASSED ONE SECOND PASSED ONE SECOND PASSED ONE SECOND PASSED ONE SECOND PASSED ONE SECOND PASSED
Timer
, ASP.NET CoreIt is possible to use a Timer
in an ASP.NET Core. First, create an ASP.NET Core Web application, and then modify the Configure
method in the Startup file.
UseEndpoints
, and call WriteAsync
with the string
returned by DateList
.Timer
when DateList
is called, and also allocate the List
. We call Start on the timer.Timer
's Elapsed event is called every 3 seconds, and DateTime.Now
is added to the list.string
every 3 seconds on the server.using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; namespace WebApplication1 { public class Startup { public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGet("/", async context => { // Write the times. await context.Response.WriteAsync(TimerExample.DateList); }); }); } } }using System; using System.Collections.Generic; using System.Text; using System.Timers; public class TimerExample { static Timer _timer; static List<DateTime> _dates; public static string DateList { get { // Lazily initialize the list and timer. if (_dates == null) { _dates = new List<DateTime>() { DateTime.Now }; // Run timer every 3 seconds. _timer = new Timer(3000); _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); _timer.Enabled = true; } // Return string containing all our times. var builder = new StringBuilder(); foreach (var date in _dates) { builder.Append(date).Append('\n'); } return builder.ToString(); } } static void _timer_Elapsed(object sender, ElapsedEventArgs e) { // Add date on each timer event. _dates.Add(DateTime.Now); } }3/22/2020 7:33:36 AM 3/22/2020 7:33:39 AM 3/22/2020 7:33:42 AM
It is possible to use a timer in older web technologies like Web Forms as well. We can store a Timer
in a class
, and run it on the server.
The Timer
class
from the System.Timers
namespace can be used to run code on an interval. An interval-based validation approach is recommended for important applications.