DispatcherTimer与Thread.Sleep的效率

本文关键字:效率 Sleep Thread DispatcherTimer | 更新日期: 2023-09-27 18:23:48

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

DispatcherTimer与Thread.Sleep的效率

如果你需要在调度器线程中操作,那么你真的不想使用Thread.Sleep——你最终会阻塞调度器线程,所以你的用户界面会被冻结。

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

既然您已经指出您实际上没有UI,那么DispatcherTimer是错误的选择,因为没有涉及调度器。相反,我会使用其他计时器类之一,例如System.Threading.Timer。在我看来,使用计时器比使用单独的后台线程更清楚地表明意图(重复地做某事)。然而,我不会担心这两种解决方案的效率

DispatcherTimer将每隔N(时间单位)在UI线程上调用一个方法。CCD_ 11实际上将使线程完全休眠。不同的是,对于前者,线程继续,然后调用Tick事件,而后者停止线程执行任何操作。

重要的是要意识到UI线程正忙于渲染UI和运行代码;因此,UI线程中的睡眠将被视为应用程序挂起。