【问题标题】:How can I handle "CrossThreadMessagingException"?如何处理“CrossThreadMessagingException”?
【发布时间】:2011-12-11 07:03:29
【问题描述】:

我有一个简单的代码,可以通过标签组件在我的 GUI 中显示时间序列。此代码位于计时器的滴答事件中。有时,我得到“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);

【问题讨论】:

  • 堆栈跟踪是什么?哪个计时器?
  • 我只有一个间隔为 1000 毫秒的计时器。
  • 你应该使用Stopwatch 而不是DateTime.Now - this.StartTime: msdn.microsoft.com/en-us/library/…。它更精确,旨在获取经过的时间。

标签: c# multithreading exception thread-safety


【解决方案1】:

计时器事件很可能是从另一个线程访问控件,例如来自 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; }
}

【讨论】:

  • 为什么这个异常只是偶尔发生,而不是每次都发生?有人会认为 Timer 线程总是与 GUI 线程不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多