开发者

Atomic timer callback design question

开发者 https://www.devze.com 2023-03-02 03:53 出处:网络
I want to call the timer callback just one time until it finishes the task. For example if the timer interval is five minutes and the task may be done within 2-20 minutes, if the previous task is not

I want to call the timer callback just one time until it finishes the task. For example if the timer interval is five minutes and the task may be done within 2-20 minutes, if the previous task is not completed, new threads doesn't enter callback method.

Currently I do this by a volatile counter but it doesn't make sense to me. There should be a best practice. Sample code:

private volatile int _counter = 0;
private readonly object _syncLock = new object();

void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    lock(syncLock)
    {
        if (_counter > 0)
            return;
        else
   开发者_StackOverflow社区         Interlocked.Increment(ref _counter);
    }

    // Method body

    Interlocked.Decrement(ref _counter);
}


This one is simple enough actually. When you initialize the timer set the AutoReset property to false.

_timer.AutoReset = false;

Then at the end of your event handler invoke this:

_timer.Start();
0

精彩评论

暂无评论...
验证码 换一张
取 消