.NET计时器:什么是在X秒内通知的最佳方式?

时间:2008-09-29 13:12:55

标签: .net asynchronous timer

假设我有一个非重复发生的事件,需要在X秒后提出,例如超时。直观地说,创建一个System.Timers.Timer,将其间隔设置为X * 1000,将其勾选到事件并启动它是有意义的。由于这是一个非经常性的事件,你只需要它一旦你需要在它滴答之后停止计时器。

然而,如果这确实是最好的做法,那么计时器固有地反复出现的事实让我不信任。是否更好/更准确/更安全地保存开始时间,将计时器设置为每秒(或甚至毫秒)滴答,然后勾选轮询系统的时间并仅在必要时间过去后手动提升目标事件? / p>

如果任何一种方法最好(也许还有另一种选择,我也没有想到),任何人都可以权衡。如果我需要等待的时间跨度是以毫秒为单位测量的,那么一种方法是否会比另一种更好?

6 个答案:

答案 0 :(得分:10)

System.Threading.Timer的此constructor允许您指定期间。如果将此参数设置为-1,它将禁用定期信令并仅执行一次。

public Timer(
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
)

答案 1 :(得分:5)

只需使用普通计时器,并在经过一次后将其禁用。 这应该可以解决你的问题。

both,system.threading.timer和system.timers.timer都支持这个。

答案 2 :(得分:2)

关闭新的BackgroundWorker,睡眠,关闭。

var worker = new BackgroundWorker();
worker.DoWork += delegate {
  Thread.Sleep(30000); 
  DoStuff();
} 
worker.RunWorkerAsync();

答案 3 :(得分:1)

您可以使用AutoReset = true的System.Timers.Timer,或者使用无限期的System.Threading.Timer(System.Threading.Timeout.Infinite = -1)来执行一次计时器。

在任何一种情况下,如果你没有重复的间隔,你应该在你完成它时(在Timers.Timer的事件处理程序或Threading.Timer的回调中)处理你的计时器。

答案 4 :(得分:0)

在X秒后将其设置为勾选,并在刻度的代码中执行:

timer.enabled = false;

为我工作。

答案 5 :(得分:0)

如果您想要准确的时间测量,您应该考虑将定时器频率加倍并使用DateTime.Now与您的开始时间进行比较。定时器和Thread.Sleep在时间测量中不一定精确。