【问题标题】:Atomic timer callback design question原子定时器回调设计题
【发布时间】:2011-05-03 14:01:48
【问题描述】:

我想只调用一次计时器回调,直到它完成任务。比如定时器间隔为五分钟,任务可能在2-20分钟内完成,如果上一个任务没有完成,新线程不会进入回调方法。

目前我通过 volatile 计数器执行此操作,但这对我来说没有意义。应该有一个最佳实践。示例代码:

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
            Interlocked.Increment(ref _counter);
    }

    // Method body

    Interlocked.Decrement(ref _counter);
}

【问题讨论】:

  • 你不需要lock Interlocked
  • @Henk:没有它,很多线程会进入方法。实际间隔是一个很小的值。
  • 我以为是几分钟。但即使那样你也需要一个监视器,我的错。

标签: c# timer callback


【解决方案1】:

这个其实很简单。初始化计时器时,将 AutoReset 属性设置为 false。

_timer.AutoReset = false;

然后在事件处理程序结束时调用:

_timer.Start();

【讨论】:

  • 那是 Timers.Timer,Threading.Timer 没有 AutoReset。
  • @Henk - 通过检查事件处理程序的参数,我推断这实际上是一个 System.Timers.Timer 实例。
猜你喜欢
  • 2019-01-26
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
相关资源
最近更新 更多