Non-reentrant timers
c#, thread-safety, timer
Solution
I'm guessing, as your question is not entirely clear, that you want to ensure that your timer cannot re-enter your callback whilst you are processing a callback, and you want to do this without locking. You can achieve this using a `System.Timers.Timer` and ensuring that the `AutoReset` property is set to false. This will ensure that you have to trigger the timer on each interval manually, thus preventing any reentrancy:
public class NoLockTimer : IDisposable
{
private readonly Timer _timer;
public NoLockTimer()
{
_timer = new Timer { AutoReset = false, Interval = 1000 };
_timer.Elapsed += delegate
{
//Do some stuff
_timer.Start(); // <- Manual restart.
};
_timer.Start();
}
public void Dispose()
{
if (_timer != null)
{
_timer.Dispose();
}
}
}
Problem
I have a function that I want to invoke every x seconds, but I want it to be thread-safe. Can I set up this behavior when I am creating the timer? (I don't mind which .NET timer I use, I just want it to be thread-safe). I know I can implement locks inside my callback function, but I think it would be more elegant if it were in the timer level. My callback function, and environment are not related to a UI. [Edit 1] I just don't want there to be more than one thread inside my callback function. [Edit 2] I want to keep the locking inside the timer level, because the timer is responsible for when to call my callback, and here there is a particular situation when I don't want to call my callback function. So I think when to call is the responsibility of the timer.