【发布时间】: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:没有它,很多线程会进入方法。实际间隔是一个很小的值。
-
我以为是几分钟。但即使那样你也需要一个监视器,我的错。