比较使用Thread.Sleep和Timer延迟执行
我有一个方法,应该在指定的时间内延迟运行。
我应该使用
Thread thread = new Thread(() => { Thread.Sleep(millisecond);
action();
});
thread.IsBackground = true;
thread.Start();
要么
Timer timer = new Timer(o => action(), null, millisecond, -1);
我读过一些有关使用不良设计的文章Thread.Sleep
。但是我真的不明白为什么。
但是对于使用Timer而言,Timer具有dispose方法。由于执行被延迟,因此我不知道如何处置Timer。你有什么建议吗?
或者,如果您有其他代码延迟执行,也将不胜感激。
回答:
一个区别是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进行操作,则使用a
System.Windows.Forms.Timer
可能是更好的选择,因为它将在UI线程上运行回调。然而,如果不是这种情况下,它的到Thread.Sleep
主场迎战Threading.Timer
,Threading.Timer
是要走的路。
以上是 比较使用Thread.Sleep和Timer延迟执行 的全部内容, 来源链接: utcz.com/qa/420701.html