我偶然发现了类似下面的代码:
private void SomeCallBack(object state)
{
lock (_lock)
{
try
{
if (_timer == null)
return;
_timer.Dispose();
// do some work here
}
catch
{
// handle exception
}
finally
{
_timer = new Timer(SomeCallBack, state, 100, Timeout.Infinite);
}
}
}
我不理解每次执行回调时重新创建计时器的目的。我认为代码试图实现的是一次只有一个线程可以执行工作。但是锁定不够吗?
另外,根据msdn,
请注意,调用Dispose()方法重载后可能会发生回调
这样做有什么好处吗? 如果是这样,那么处理和创建计时器的开销是否合理呢?
感谢您的帮助。
答案 0 :(得分:1)
似乎代码想要一个接近周期性的定时器(由于定时器到期和创建新定时器之间的处理引入的抖动,因此不完全是周期性的)。处置和重新创建计时器确实是不必要的开销。 Change
方法会更好。
检查null也很好奇;在其他地方,必须有代码设置_timer
null才能使其生效。
答案 1 :(得分:0)
重新创建计时器的原因是针对计时器回调中的代码执行时间比计时器周期更长的情况。在这种情况下,回调的多个实例将同时运行。