Windows窗体更新来自其他线程的控件

时间:2011-08-24 15:43:55

标签: c# multithreading timer

  

可能重复:
  How to update GUI from another thread in C#?
  My Timer event crashes because the events are called on a different thread

我有一个计时器对象,我想定期更新一个标签的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";

    }

2 个答案:

答案 0 :(得分:2)

对于WPF,使用DispatcherTimer,对于Windows表单,我认为System.Windows.Forms.Timer应该做你想要的。

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

答案 1 :(得分:2)

如果您使用的是.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";
    }
}