在C#中使用效率更高,DispatcherTimer
还是Thread.Sleep
?
我可以使用DispatcherTimer
:
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(20);
timer.Tick += timer_Tick;
timer.Start(); // do something every 20 seconds
或者,我可以使用Thread.Sleep
:
while(true) {
Thread.Sleep(20000);
// do something every 20 seconds
}
我们应该在哪些情况下使用它们?有没有最好的做法?
编辑:根据第一个答案,我需要补充说我正在开发的应用程序没有UI(因此阻塞线程没有问题),因为它是一个后台跟踪器,只是将其数据写入日志文件。
答案 0 :(得分:5)
如果您需要在调度程序线程中操作,那么您确实不想使用Thread.Sleep
- 您最终会阻止调度程序线程,所以您的用户界面将被冻结。
你可以让后台线程在操作之间休眠20秒,并使用Dispatcher.Invoke
在调度程序线程上执行操作,但这对我来说似乎毫无意义。 DispatcherTimer
比和更容易使用,它避免了另一个线程拥有自己的专用堆栈。
现在你已经表明你实际上没有用户界面,DispatcherTimer
是错误的选择,因为没有调度员参与。我会使用其他计时器类之一,例如System.Threading.Timer
。在我看来,使用计时器可以更清楚地表明意图(重复做一些事情),而不仅仅是拥有一个单独的后台线程。但是,我不担心任何一种解决方案的效率。
答案 1 :(得分:2)
DispatcherTimer
将每隔N [单位时间]调用UI线程上的方法。 Thread.Sleep
实际上会完全睡眠。区别在于前者继续,然后调用Tick
事件,后者阻止线程做任何事情。
了解UI线程忙于呈现UI并运行代码非常重要;因此,UI线程中的睡眠将被视为应用程序挂起。