5

假设我有一个需要在 X 秒后引发的非重复事件,例如超时。直观地说,创建一个 System.Timers.Timer,将其间隔设置为 X*1000,将其刻度线连接到事件并启动它是有意义的。由于这是一个非重复事件,并且您只希望它在一次触发后才被触发,然后您必须在计时器计时结束后停止它。

然而,如果这确实是最好的方法,定时器本质上是重复的,这让我不信任。保存开始的时间会更好/更准确/更安全吗,将计时器设置为每秒(甚至毫秒)滴答,并在滴答时轮询系统时间并仅在必要时间过去后手动引发目标事件?

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

4

6 回答 6

10

System.Threading.Timer 的这个构造函数允许您指定一个点。如果将此参数设置为 -1,它将禁用周期性信号并且只执行一次。

public Timer(
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
)
于 2008-09-29T13:31:21.393 回答
5

只需使用普通计时器并在它过去一次后将其禁用。那应该可以解决您的问题。

system.threading.timer 和 system.timers.timer 都支持这一点。

于 2008-09-29T13:15:00.497 回答
2

分拆一个新的 BackgroundWorker,休眠,关闭。

var worker = new BackgroundWorker();
worker.DoWork += delegate {
  Thread.Sleep(30000); 
  DoStuff();
} 
worker.RunWorkerAsync();
于 2008-09-29T13:16:59.197 回答
1

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

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

于 2008-09-29T21:10:42.443 回答
0

只需将其设置为在 X 秒后打勾,然后在打勾的代码中执行以下操作:

timer.enabled = false;

为我工作。

于 2008-09-29T13:23:50.897 回答
0

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

于 2008-09-29T14:02:46.967 回答