可能重复:
Why am I getting this error:“Cross-thread operation not valid: Control lbFolders accessed from a thread other than the thread it was created on.”?
Invoke or BeginInvoke cannot be called on a control until the window handle has been created
我遇到线程问题。
我每隔600ms从COM端口获取数据,当我处于调试模式时,我收到的错误就像几秒钟之后但是当我处于非调试运行模式时,我会在一两分钟后收到错误,但错误仍然存在。
我得到的错误发生在每个线程上调用的一些函数上。
以下是错误图片:
代码的其他部分:
private void LoadData()
{
while (td.IsAlive)
{
eng.GetSpeedKmh();
eng.GetEngineRpm();
eng.GetCalculatedEngineLoadValue();
eng.GetFuelLevelInput();
eng.GetEngineTemp();
eng.MAF();
System.Threading.Thread.Sleep(600);
}
}
我该怎么做才能解决这个问题?
答案 0 :(得分:2)
尝试以下代码
public void eng_OnGetSpeedDone(OBDIIEngineEventArgs args)
{
if (this.InvokeRequired)
{
Action action = () => eng_OnGetSpeedDone(args);
Invoke(action);
return;
}
if (!args.OBDResultNoData)
brzina_ele.Text = arg.OBDValue.ToString();
else
brzina_ele.Text = "0";
}
答案 1 :(得分:-1)
调用.Text属性的编辑:
this.Invoke((MethodInvoker) delegate { brzina_ele.Text = "Its new value"; });
您也可以使用它的Tick事件从Windows.Forms.Timer进行调用。这更加线程安全,并且拥有您需要的一切。