2012-04-16 73 views
2

我的WPF应用程序涉及多个定时器。一切都适用于DispatcherTimers,但延迟很大,经常冻结(例如,冻结3秒,然后剩余的3秒一次)。多个定时器WPF应用程序,调用线程必须是STA错误

我的问题是我不知道我到底需要重新设计我的应用程序来解决这个问题。从来没有使用过线程和它的第一个真正的WPF应用程序。

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

我从命名空间System.Timers由定时器代替我的调度员计时器得到这个错误

旧代码与调度员计时器:

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的格式)
    • 一个执行SQL查询和检索的日期值每5秒
    • 一个更新的停机时间计时器每隔第二内侧一个动态自定义样式的WPF按钮。我使用秒表记录停机时间。

    所以看起来我需要胎面和/或BackgroundWorker的工作?

    不确定我是如何从这开始的,因为我现在已经有一段时间了。一些示例代码将是最受欢迎的。

    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。

  • 回答

    1

    System.Timers.Timer似乎需要一个STA线程。 STA线程是Windows窗体的一个需求,但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. 
    } 
    
    +0

    当我尝试使用线程计时器时声明tick方法时,我似乎遇到错误。 – Jackz 2012-04-16 14:11:28

    +0

    没有滴答事件/方法。你什么意思? – 2012-04-16 14:14:21

    +0

    我的意思是每x秒执行一个特定的方法。我如何用这种计时器来做到这一点? – Jackz 2012-04-16 14:15:13