I’m working with a timeout which is set to occur after a certain elapsed period, after which I would like to get a callback. Right now I am doing this using a Timer that when fired disposes of itself.
public class Timeouter
{
public void CreateTimeout(int timeout, Action onTimeout)
{
Timer t = null;
t = new Timer(_ =>
{
onTimeout();
t.Dispose();
}, new object(), timeout, Timeout.Infinite);
}
}
I’m a bit concerned regarding the resource use of this timer since it could potentially be called quite frequently and would thus setup a lot of timers to fire just once and dispose of themselves. Considering that the timer is an IDisposable it would indicate to me that it indeed uses some sort of expensive resource to accomplish its task.
- Am I worrying too much about the resource usage of the
Timer, or perhaps the solution is fine as it is? - Do I have any other options for doing this? Would it be better to have a single timer and fiddling with it’s frequency starting and stopping it as necessary in order to accommodate several of these timeouts? Any other potentially more lightweight option to have a task execute once after a given period of time has elapsed?
.Net has 2 or 3 timer classes which are expensive. However the
System.Threading.Timerclass which you’re using is a very cheap one. This class do not use kernel resources or put a thread to sleep waiting for timeout. Instead it uses only one thread for all Timer instances, so you can easily have thousands of timers and still get a tiny processor and memory footprint. You must callDisposeonly because you must notify the system to stop tracking some timer instance, but this do not implies that this is a expensive class/task at all.Once the timeout is reached this class will schedule the callback to be executed by a
ThreadPoolthread, so it do not start a new thread or something like this.