WPF Dispatchertimer延迟反应/冷冻

时间:2012-04-16 11:33:10

标签: c# .net wpf

在我的WPF应用程序中,我使用了3种不同的DispatcherTimers。

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

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

我在整个应用程序中遇到此行为。 用几个计时器解决这个问题的正确方法是什么?

编辑:

我在使用System.Timers命名空间中的Timer替换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 个答案:

答案 0 :(得分:3)

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

HTH, 马丁

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

不要忘记在UI线程上从SyncronizationContext.Current获取上下文。