2012-04-16 166 views
2

在我的WPF应用程序中,我使用3个不同的DispatcherTimers。WPF Dispatchertimer延迟反应/冻结

  • 一个是用于显示当前时间
  • 一个是是用于运行DB查询每5秒
  • 自定义按钮第三个刷新的值每1秒

当我的程序正在运行,有很多延迟/冻结。 例如,时间开始正确滴答,但突然间,数值冻结,冻结后时间增加+3秒。

我正在通过我的整个应用程序获取此行为。 用几个定时器解决这个问题的正确方法是什么?

编辑:

我有问题,从System.Timers命名空间的计时器更换DispatcherTimer。

//new code with timer 
timerW = new Timer(); 
     timerW.Elapsed += new ElapsedEventHandler(timerWegingen_Tick); 
     timerW.Interval = 5000; 
     timerW.Start(); 

     //OLD Working Code 
     timerW = new DispatcherTimer(); 
     timerW.Tick += new EventHandler(timerWegingen_Tick); 
     timerW.Interval = new TimeSpan(0, 0,5); 
     timerW.Start(); 

错误:“调用线程必须是STA,因为许多UI组件都需要这个。”

此致敬礼。

回答

3

DispatcherTimer在UI线程上执行。因此,如果UI线程忙于超过时间间隔,它将在UI线程可以自由执行时执行。 如果你需要更精确的调度,你应该比在后台运行一段时间(System.Threading.Timer,System.Timers.Timer)。但是不要忘记编组。

心连心, 马丁

+0

你的意思是与编组完全一样吗?从来没有真正使用线程在真正的程序之前。所以我可以用其他类型的计时器完全替代我的Dispatcher计时器功能? – Jackz 2012-04-16 11:41:55

+0

事件将在不同的线程上触发,因此您需要在UI线程上执行UI。那就是编组 – 2012-04-16 14:19:19

0

我想这是因为他们都在同一个线程上运行。

+0

所以我需要运行每个计时器在一个单独的线程或有其他解决方案。定时器始终运行不间断。 – Jackz 2012-04-16 11:37:19

+0

对于不同的定时器,是不同的线程应该是最好的解决方案。使用这个http://stackoverflow.com/questions/5727023/start-a-timer-from-different-thread-in-c-sharp – 2012-04-16 11:39:06

+0

或这个http://stackoverflow.com/questions/1416803/system-timers-计时器与系统线程计时器 – 2012-04-16 11:41:29

0

使用System.Threading.Timer当更新UI使用SyncronizationContext.Syncronize运行在更新代码。

不要忘记得到SyncronizationContext.Current上下文在UI线程上。

+0

要多说明一点?谢谢。 System.Timer的语法看起来更像调度器,然后是线程计时器。 – Jackz 2012-04-16 12:29:26