繁体   English   中英

WPF应用程序的多个计时器,调用线程必须是STA错误

[英]Multiple Timers WPF application, The calling thread must be STA Error

我的WPF应用程序涉及几个计时器。 一切都与DispatcherTimers一起使用,但延迟很大,并且经常发生冻结(例如冻结3秒,然后立即添加剩余的3秒)。

我的问题是我不确定如何重新设计我的应用程序才能解决此问题。 之前从未使用过线程,也从未使用过它,这也是我的第一个真正的WPF应用程序。

我收到以下错误: 调用线程必须是STA,因为许多UI组件都需要此。

我通过用命名空间System.Timers中的Timer替换了Dispatcher计时器而收到此错误。

带调度计时器的旧代码:

timerW = new DispatcherTimer();
        timerW.Tick += new EventHandler(timerW_Tick);
        timerW.Interval = new TimeSpan(0, 0, 5000);
        timerW.Start();

带有计时器的新代码:

            timerW = new Timer();
            timerW.Elapsed += new ElapsedEventHandler(timerW_Tick);
            timerW.Interval = 5000; 
            timerW.Start();            

每5秒钟执行一次查询以检索日期值。 当满足某些条件时,将动态创建按钮。 例如, 如果日期保持3分钟不变,则会创建一个按钮。

动态创建的按钮包含:

  • 来自数据库的日期
  • 创建按钮后开始运行的计时器。 此计时器仅在创建新按钮时停止,它记录停机时间。
  • 停机的原​​因

这些按钮将保存在ObservableCollection中,并使用“依赖项属性”,以便在发生更改时得到通知。 这是一个带有几个文本块的自定义按钮,用于显示信息。

按钮部分是程序中所有交互的地方,其余界面仅显示数据库中的信息。 这些按钮被放置在定制的滑块中,例如带有左右导航按钮的控件。

简而言之,我的程序有3个不同的调度程序计时器。

  • 一个显示当前时间(hh:mm:ss格式)
  • 每5秒执行一次SQL查询并检索日期值的程序
  • 一个在动态自定义样式的WPF按钮中每秒更新一次停机计时器的按钮。 我使用秒表记录了两者之间的停机时间。

所以看来我需要与踏板和/或背景工合作

不知道我实际上是如何开始的,因为一段时间以来我的线索很少。 一些示例代码将是最受欢迎的。

Tldr:

我使用计时器的原因如下:

  • 显示当前时间
  • 记录停机时间(实时,因此我实际上看到的是秒数)
  • 每5秒执行一次的SQL查询。

编辑:

public void InitializeDispatcherTimerW()
    {
        TimerCallback callback = MyTimerCallBack;
        timerWegingen = new Timer(callback, null, 0, 5000);

        timerWegingen.Change(0, 5000);
    }

    private void MyTimerCallBack(object state)
    {
        DisplayWegingInfo();
        CaculateTimeBetweenWegingen();
    }

最好的问候,Jackz。

System.Timers.Timer似乎需要STA线程。 Windows窗体需要STA线程,但是WPF显然不需要它。

System.Threading.Timer是否满足您的需求?

这是一个例子:

// firstTickInterval and interval are TimeSpans
TimerCallback callback = MyTimerCallback;
Timer timer = new Timer(callback, null, firstTickInterval, interval);
// timer is now running
// To stop the timer, do timer.Change(-1, -1);

回调函数如下所示:

void MyTimerCallback(object state)
{
    // This is not guaranteed to execute on the UI thread.
    // In this example, state will be null, since we passed null in the Timer constructor.
}

当计时器回调代码与UI元素交互时,您需要使用:

UIElement.Dispatcher.BeginInvoke(...);

更多信息: http : //msdn.microsoft.com/en-us/magazine/cc163328.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM