which is the right approach to use a System.Timers.Timer?
I mean… I create the timer, set the interval and the method to be called on the Elapsed event.
double ms = 1000;
var t = new System.Timers.Timer(ms);
t.AutoReset = false;
t.Elapsed += (sender, e) => { runTask(); };
t.Start();
What next? Should a call dispose on the Timer? I suppose I can’t, or the Elapsed event will never occur.
Should I register the Timer in some global variable to avoid to lose references to it and so the GC could dispose the timer before the Elapsed is called?
And if so, how can I dispose the Timer once the Elapsed event has been handled (thus my task has been executed)?
A short answer is you don’t need to do anything. It will be collected by the Garbage Collector when function goes out of scope. If you want it available then declare it in class instead.
Usually when you declare a timer out in class level it is collected by GC when the Class is Disposed. However when you have your timer declare in a Function then the Timer still runs but if you are executing a very long process then GC can Aggressively Dispose it so you will need to use
Have a look at the end of the Timer’s Documentation for reference to this scenario.
The Comments in the sample code says:
Normally, the timer is declared at the class level, so that it stays in scope as long as it is needed. If the timer is declared in a long-running method, KeepAlive must be used to prevent the JIT compiler from allowing aggressive garbage collection to occur before the method ends.