C# Tip: Raise synchronous events using Timer (and not a While loop)

There may be times when you need to process a specific task on a timely basis, such as polling an endpoint to look for updates or refreshing a Refresh Token.
If you need infinite processing, you can pick two roads: the obvious one or the better one.
For instance, you can use an infinite loop and put a Sleep command to delay the execution of the next task:
1 2 3 |
<span class="token keyword">while</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Thread<span class="token punctuation">.</span><span class="token function">Sleep</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token string">"Hello, Davide!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
There’s nothing wrong with it – but we can do better.
Introducing System.Timers.Timer
The System.Timers
namespace exposes a cool object that you can use to achieve that result: Timer
.
You then define the timer, choose which event(s) must be processed, and then run it:
1 2 3 4 5 6 7 |
<span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">Main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">System<span class="token punctuation">.</span>Timers<span class="token punctuation">.</span>Timer</span> timer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">System<span class="token punctuation">.</span>Timers<span class="token punctuation">.</span>Timer</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> timer<span class="token punctuation">.</span>Elapsed <span class="token operator">+=</span> AlertMe<span class="token punctuation">;</span> timer<span class="token punctuation">.</span>Elapsed <span class="token operator">+=</span> AlertMe2<span class="token punctuation">;</span> timer<span class="token punctuation">.</span><span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">AlertMe</span><span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">object</span></span> sender<span class="token punctuation">,</span> <span class="token class-name">ElapsedEventArgs</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token string">"Ciao Davide!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">AlertMe2</span><span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">object</span></span> sender<span class="token punctuation">,</span> <span class="token class-name">ElapsedEventArgs</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token string">"Hello Davide!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
The constructor accepts in input an interval (a double
value that represents the milliseconds for the interval), whose default value is 100.
This class implements IDisposable
: if you’re using it as a dependency of another component that must be Dispose
d, don’t forget to call Dispose
on that Timer.
Note: use this only for synchronous tasks: there are other kinds of Timers that you can use for asynchronous operations, such as PeriodicTimer
, which also can be stopped by canceling a CancellationToken
.
This article first appeared on Code4IT 🐧
Happy coding!
🐧
Source: https://www.code4it.dev/csharptips/timer-to-trigger-synchronous-events