DispatcherTimer与Thread.Sleep的效率
本文关键字:效率 Sleep Thread DispatcherTimer | 更新日期: 2023-09-27 18:23:48
在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(因此阻塞线程没有问题),因为它是一个后台跟踪器,只需将数据写入日志文件。
如果你需要在调度器线程中操作,那么你真的不想使用Thread.Sleep
——你最终会阻塞调度器线程,所以你的用户界面会被冻结。
可以让后台线程在操作之间睡眠20秒,并使用Dispatcher.Invoke
在调度器线程上执行操作,但这对我来说似乎毫无意义。DispatcherTimer
比更容易使用,而且避免了使用另一个具有自己专用堆栈的线程。
既然您已经指出您实际上没有UI,那么DispatcherTimer
是错误的选择,因为没有涉及调度器。相反,我会使用其他计时器类之一,例如System.Threading.Timer
。在我看来,使用计时器比使用单独的后台线程更清楚地表明意图(重复地做某事)。然而,我不会担心这两种解决方案的效率。
DispatcherTimer
将每隔N(时间单位)在UI线程上调用一个方法。CCD_ 11实际上将使线程完全休眠。不同的是,对于前者,线程继续,然后调用Tick
事件,而后者停止线程执行任何操作。
重要的是要意识到UI线程正忙于渲染UI和运行代码;因此,UI线程中的睡眠将被视为应用程序挂起。