DispatcherTimer与Thread.Sleep的效率

时间:2014-09-22 09:20:49

标签: c# multithreading timer

在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(因此阻塞线程没有问题),因为它是一个后台跟踪器,只是将其数据写入日志文件。

2 个答案:

答案 0 :(得分:5)

如果您需要在调度程序线程中操作,那么您确实不想使用Thread.Sleep - 您最终会阻止调度程序线程,所以您的用户界面将被冻结。

可以让后台线程在操作之间休眠20秒,并使用Dispatcher.Invoke在调度程序线程上执行操作,但这对我来说似乎毫无意义。 DispatcherTimer更容易使用,它避免了另一个线程拥有自己的专用堆栈。

现在你已经表明你实际上没有用户界面,DispatcherTimer是错误的选择,因为没有调度员参与。我会使用其他计时器类之一,例如System.Threading.Timer。在我看来,使用计时器可以更清楚地表明意图(重复做一些事情),而不仅仅是拥有一个单独的后台线程。但是,我不担心任何一种解决方案的效率

答案 1 :(得分:2)

DispatcherTimer将每隔N [单位时间]调用UI线程上的方法。 Thread.Sleep实际上会完全睡眠。区别在于前者继续,然后调用Tick事件,后者阻止线程做任何事情。

了解UI线程忙于呈现UI并运行代码非常重要;因此,UI线程中的睡眠将被视为应用程序挂起。