一个区别是System.Threading.Timer在线程池线程上调度回调,而不是每次都创建一个新线程。如果您在应用程序的生命周期中需要这样的操作不止一次,这将节省创建和销毁一堆线程的开销(这是一个非常耗费资源的进程,正如您参考的文章指出的那样),因为它会只是重用池中的线程,并且如果您将同时运行多个计时器,这意味着您将有更少的线程同时运行(同时节省大量资源)。
换句话说,计时器将会更有效率。它也可能更准确,因为只要您指定的时间量(OS可能使其睡眠时间更长),Thread.Sleep只能保证至少等待。当然,Timer仍不会完全准确,但意图是尽可能接近指定的时间触发回调,而这不一定是Thread.Sleep的意图。
至于销毁定时器,回调可以接受一个参数,所以你可能能够传递Timer本身作为参数,并在回调中调用Dispose(虽然我没有试过这个 - 我想这是回调期间定时器可能被锁定)。
编辑:不,我想你不能这样做,因为你必须在指定Timer构造本身的回调参数。
也许这样? (再次,还没有真正尝试过)
class TimerState
{
public Timer Timer;
}
...并启动定时器:
TimerState state = new TimerState();
lock (state)
{
state.Timer = new Timer((callbackState) => {
action();
lock (callbackState) { callbackState.Timer.Dispose(); }
}, state, millisecond, -1);
}
锁定应防止计时器回调从设法释放之前,定时器,定时器字段已被设置。
附录:正如评论者指出的那样,如果行动()做了与UI,然后使用一个System.Windows.Forms.Timer可能是一个更好的选择,因为它将运行在UI回调线。但是,如果情况并非如此,那么Thread.Sleep与Threading.Timer就是Threading.Timer。
也值得指出与System.Windows.Forms.Timer的区别,我相信*在UI线程上调用一个函数,这对WinForms应用程序非常重要! – 2008-12-24 17:13:10
对于未来的读者,“睡眠”并不是保证至少是事件,据记载它可能更少。 – 2013-04-01 14:04:19
出于好奇......记录在哪里? – 2013-04-01 15:05:01