2

我在我的 WPF 应用程序中遇到了一件奇怪的事情。我已经尝试过 DispatcherTimer 和 System.Timers.Timer 类,并比较了秒表所花费的时间。当我使用 DispatcherTimer 时,我的应用程序和秒表显示的间隔似乎几乎没有区别(测试了 30 分钟)。但是当我使用另一个 Timer 时,我在我的应用程序中大大浪费了时间。我本可以使用 DispatcherTimer,但问题是:当我从其他地方更新我的 UI 时,调度程序计时器似乎在该特定时间间隔内冻结,因此,它也失去了时间。为什么会发生这种情况以及如何纠正它?

4

2 回答 2

1

在评论中,@Joey 建议Comparing Timer with DispatcherTimer问题的答案可能会有所帮助。你的回应是

不,我实际上是在阅读该链接后发布的。我不明白为什么 System.Threading.Timer 大约损失了这么多时间。3秒。在 5 分钟内。虽然调度程序没有丢失任何东西。如果我的其他一些进程导致了这种延迟,那么它也应该反映在调度程序中,我猜

但是,如果您已经阅读了链接问题的答案,那么您已经有了答案。如那里所述,这是因为Timer该类已针对 Windows 窗体应用程序进行了优化,并且您正在 WPF 应用程序上使用它。这有点像在沙滩上开车......我们不应该这样做,我们可能会得到意想不到的结果。

我的建议是让您简单地使用正确的工具来完成这项工作。还值得注意的是,没有计算机计时器,甚至Stopwatch是您用来获取测试结果的类,都不会是 100% 准确的,因为运行它的处理器也将用于运行许多其他线程同时进行。

于 2014-06-19T08:36:33.297 回答
0

DispatcherTimer执行所有 WPF GUI 处理(例如渲染)的同一线程使用,其优先级高于DispatcherTimer. 这意味着如果 WPG GUI 线程需要更新显示中的某些内容,或者用户将鼠标移到新控件上或出于任何其他原因,WPF GUI 线程可能正忙于更高优先级的工作。

有两种方法可以提高精度DispatcherTimer

  1. 给予DispatcherTimer更高的优先级
DispatcherTimer timer = new(DispatcherPriority.Input);

这比默认的 DispatcherTimer 优先级快一点DispatcherPriority.Background,但渲染仍然具有更高的优先级。如果 DispatcherTimer 具有比渲染更高的优先级,例如DispatcherPriority.Send最高优先级,那么当 DispatcherTimer 需要一些时间进行处理时,用户可能会看到缓慢的 GUI。

  1. 调用下一个DispatcherTimer.Tick较早,当 GUI 线程引起延迟时。

您的DispatcherTimer.Tick方法可以比较它应该运行的时间和实际运行的时间。如果有 x 毫秒的延迟,则将 `DispatcherTimer.Interval' 缩短 x 毫秒。

我在 CodeProject 上写了一篇详细的文章:提高 WPF DispatcherTimer Precision

于 2022-02-28T10:40:43.870 回答