如何处理“Cross Thread MessagingException”?

时间:2011-10-19 20:51:54

标签: c# multithreading exception thread-safety

我有一个简单的代码,可以通过标签组件在GUI中显示时间顺序。此代码位于计时器的tick事件中。有时,我得到“Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException”,我不知道为什么?我怎么能抓住这个例外?如何更改我的代码以避免出现此异常?

    //Calculate and show elapsed time
    TimeSpan ElapsedTime = DateTime.Now - this.StartTime;
    this.LabelElapsedTime.Text = String.Format("{0:00}:{1:00}:{2:00}", ElapsedTime.Hours, ElapsedTime.Minutes, ElapsedTime.Seconds);

1 个答案:

答案 0 :(得分:6)

最有可能的是,timer事件正在从另一个线程访问控件,例如来自Timer.Interval事件。要避免此问题,必须检查Control.InvokeRequired属性,如果为true,则必须使用Control.Invoke方法中的委托来完成控制访问。

这方面的一个例子如下:

void UpdateLabel(Label lbl, String text)
{
    if (lbl.InvokeRequired)
    { lbl.Invoke(new Action<Label, String>(UpdateLabel), new object[] { lbl, text }); }
    else
    { lbl.Text = text; }
}