假设我有一个非重复发生的事件,需要在X秒后提出,例如超时。直观地说,创建一个System.Timers.Timer,将其间隔设置为X * 1000,将其勾选到事件并启动它是有意义的。由于这是一个非经常性的事件,你只需要它一旦你需要在它滴答之后停止计时器。
然而,如果这确实是最好的做法,那么计时器固有地反复出现的事实让我不信任。是否更好/更准确/更安全地保存开始时间,将计时器设置为每秒(或甚至毫秒)滴答,然后勾选轮询系统的时间并仅在必要时间过去后手动提升目标事件? / p>如果任何一种方法最好(也许还有另一种选择,我也没有想到),任何人都可以权衡。如果我需要等待的时间跨度是以毫秒为单位测量的,那么一种方法是否会比另一种更好?
答案 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在时间测量中不一定精确。