一个区别是System.Threading.Timer
在线程池线程上分派回调,而不是每次都创建一个新线程。如果您需要在应用程序的生命周期中多次发生这种情况,这将节省创建和销毁一堆线程的开销(正如您引用的文章所指出的那样,这是一个非常耗费资源的过程),因为它会只需重用池中的线程,如果您将有多个计时器同时运行,则意味着您将同时运行的线程更少(也节省了大量资源)。
换句话说,Timer
将会更有效率。它也可能更准确,因为Thread.Sleep
只保证至少等待您指定的时间量(操作系统可能会使其休眠更长时间)。当然,Timer
仍然不完全准确,但目的是尽可能接近指定时间触发回调,而这不一定是Thread.Sleep
.
至于销毁Timer
,回调可以接受一个参数,因此您可以将Timer
自身作为参数传递并在回调中调用 Dispose (虽然我没有尝试过这个 - 我猜可能是 Timer 可能是在回调期间锁定)。
编辑:不,我猜你不能这样做,因为你必须在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);
}
Timer
锁定应该防止计时器回调在设置字段之前尝试释放计时器。
附录:正如评论者所指出的,如果action()
对 UI 做了一些事情,那么使用 aSystem.Windows.Forms.Timer
可能是更好的选择,因为它将在 UI 线程上运行回调。但是,如果不是这种情况,并且归结为Thread.Sleep
vs. Threading.Timer
,Threading.Timer
那就是要走的路。