[英]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个不同的调度程序计时器。
所以看来我需要与踏板和/或背景工合作 ?
不知道我实际上是如何开始的,因为一段时间以来我的线索很少。 一些示例代码将是最受欢迎的。
Tldr:
我使用计时器的原因如下:
编辑:
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.