Windows窗体正在从其他线程更新控件

本文关键字:线程 更新 控件 其他 窗体 Windows | 更新日期: 2023-09-27 18:06:28

可能重复:
如何在C#中从另一个线程更新GUI
My Timer事件崩溃,因为这些事件是在不同的线程上调用的

我有一个计时器对象,我想定期更新作为标签的UI控件。然而,它崩溃了,并说我需要在UI线程上更新它。有人能帮忙吗?

private void frmMain_Load(object sender, EventArgs e)
    {
        aTimer = new System.Timers.Timer(1000);          
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Interval = 2000;
        aTimer.Enabled = true;
   }
   public void updateUI()
    {
        lblAirTrack.Text = "Tracking: " + itemList.Count + " items";
    }

Windows窗体正在从其他线程更新控件

如果您使用的是.NET 3.5+,请使用调度器。否则,像这样的东西应该起作用:

private delegate void updateUIDelegate();
public void updateUI()
{
    if (lblAirTrack.InvokeRequired)
    {
        lblAirTrack.Invoke(new updateUIDelegate(updateUI));
    }
    else
    {
        lblAirTrack.Text = "Tracking: " + itemList.Count + " items";
    }
}

对于WPF,使用DispatcherTimer,对于Windows窗体,我认为System.Windows.forms.Timer应该满足您的要求。

这两个计时器与System.timers.Timer类的区别在于,它们在UI线程中引发Tick事件。如果使用System.Timers.Timer,则必须手动将对UI元素的调用路由到UI线程。在wpf中,使用Dispatcher来执行此操作。UseDispatcher.BeginInvoke((。在winforms中使用Control.BeginInvoke(