我有一个计时器,应该以500毫秒的间隔运行x次。目前我的代码看起来像这样:
var i = 0;
var times = 10;
timer = new System.Threading.Timer(_ =>
{
if (timer == null || i >= times)
return;
Console.WriteLine("Run " + i);
if (i < times - 1)
i++;
else
{
timer.Dispose();
timer = null;
}
}, null, 500, 500);
这是否是取消计时器的可靠方法,如果我确保只在计时器变量中创建并引用了一个计时器?
间隔量在运行时是可变的。
答案 0 :(得分:2)
对于处理计时器看起来非常安全。我会将i和times变量设为私有而不是方法的一部分。这会创建更快的代码。此外,计时器委托可能在不同的线程上同时运行,但请参阅http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx,因此我可能会使用Interlocked.Increment方法。
也许是这样的:
class Foo
{
volatile int runCount;
int maxRunCount;
Timer timer;
void RunFor(int max)
{
maxRunCount = max;
timer = new System.Threading.Timer(_ =>
{
if (timer == null) return;
Console.WriteLine("Run " + runCount);
if (Interlocked.Increment(ref runCount) == maxRunCount)
{
timer.Dispose();
timer = null;
}
}, null, 500, 500);
}
}
<强> [编辑] 强>
在审查代码时,我可能会锁定计时器的处理,以防止竞争条件。
if (...)
{
lock(this)
{
if (timer != null) timer.Dispose();
timer = null;
}
}
答案 1 :(得分:1)
您应该使用System.Timers.Timer
课程来代替......
它支持Stop()
和Start()
方法。
简短的例子:
System.Timers.Timer timer = new System.Timers.Timer();
var i = 0;
var times = 10;
public SetupTimer()
{
timer.Interval = 500;
timer.Elapsed += OnTimerElapsed;
timer.Start();
}
private void OnTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// Logic
if (i > times)
{
timer.Stop();
}
}