【发布时间】:2018-03-14 01:39:59
【问题描述】:
当我将鼠标悬停在应用程序窗口上时,我的 DispatcherTimer 滞后,我使用 Windows 窗体和相同的代码测试了相同的东西,仅使用来自 Forms 的计时器,它没有任何滞后。
这是我的代码:
{
double dps1 = 2;
double count;
DispatcherTimer DPS = new DispatcherTimer();
public MainWindow()
{
InitializeComponent();
DPS.Tick += new EventHandler(DPS_tick);
DPS.Interval = new TimeSpan(1);
}
private void DPS_tick(object sender, EventArgs e)
{
count += dps1 / 2500;
lbl.Content = count;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
DPS.Start();
}
这是实际程序的 GIF:https://i.imgur.com/d91bxJD.gifv
【问题讨论】:
-
可能是我,但我在视频中看不到任何延迟。我应该在什么时候寻找?
-
因为它不是 Windows 窗体,当鼠标悬停在窗体上时,您正在与 UI 线程进行交互。由于 DispatcherTimer(在这种情况下)使用 UI 线程,因此它需要在 UI 线程上安排其工作,而您正在搞砸。尝试使用常规 Timer 并使用 Dispatcher.Invoke 更新 UI。
-
还要注意
DPS.Interval = new TimeSpan(1)将间隔设置为 100 纳秒。 -
@Will:我可以发誓这是相反的——像 Windows.Forms.Timer 这样的旧代码在 UI 线程上运行。调度程序没有。
-
DispatcherTimer 的运行方式与原生 winapi 中的计时器非常相似,它们的通知具有最低优先级。用户输入总是先于它,在这种情况下有很多 MouseMove 通知。 WPF 使用 DispatcherPriority 来控制这一点,DispatcherTimer 的默认构造函数使用 DispatcherPriority.Background。但它很好,you can mess with that。请注意,您需要先在没有附加调试器的情况下在发布版本中进行测试,我对可视化树调试功能有点怀疑。