3

在我的 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 组件都需要这个。”

最好的祝福。

4

3 回答 3

3

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

hth,马丁

于 2012-04-16T11:36:52.663 回答
0

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

于 2012-04-16T11:35:36.393 回答
0

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

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

于 2012-04-16T12:26:03.883 回答