Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我该如何处理;CrossThreadMessaginException“;?_C#_Multithreading_Exception_Thread Safety - Fatal编程技术网

C# 我该如何处理;CrossThreadMessaginException“;?

C# 我该如何处理;CrossThreadMessaginException“;?,c#,multithreading,exception,thread-safety,C#,Multithreading,Exception,Thread Safety,我有一个简单的代码,通过标签组件在GUI中显示时间序列。此代码位于计时器的滴答声事件中。有时,我会收到“Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessaginException”,我不知道为什么?如何捕获此异常?如何更改代码以避免出现此异常 //Calculate and show elapsed time TimeSpan ElapsedTime = DateTime.Now - this.StartTime;

我有一个简单的代码,通过标签组件在GUI中显示时间序列。此代码位于计时器的滴答声事件中。有时,我会收到“Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessaginException”,我不知道为什么?如何捕获此异常?如何更改代码以避免出现此异常

    //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);

计时器事件很可能是从另一个线程访问控件,例如从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; }
}
void UpdateLabel(标签lbl,字符串文本)
{
如果(lbl.InvokeRequired)
{lbl.Invoke(新操作(UpdateLabel),新对象[]{lbl,text});}
其他的
{lbl.Text=Text;}
}

堆栈跟踪是什么?哪个计时器?我只有一个间隔为1000毫秒的计时器。你应该使用
秒表而不是
DateTime.Now-this.StartTime
:。它更精确,并且设计用于获取经过的时间。为什么异常只发生在某些时候,而不是每次?有人会认为计时器线程总是不同于GUI线程。