跨线程操作无效

时间:2012-08-28 11:40:32

标签: c# multithreading

  

可能重复:
  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端口获取数据,当我处于调试模式时,我收到的错误就像几秒钟之后但是当我处于非调试运行模式时,我会在一两分钟后收到错误,但错误仍然存​​在。

我得到的错误发生在每个线程上调用的一些函数上。

以下是错误图片:

ERROR

代码的其他部分:

private void LoadData()
        {
            while (td.IsAlive)
            {
                eng.GetSpeedKmh();
                eng.GetEngineRpm();
                eng.GetCalculatedEngineLoadValue();
                eng.GetFuelLevelInput();
                eng.GetEngineTemp();
                eng.MAF();

                System.Threading.Thread.Sleep(600);
            }
        }

我该怎么做才能解决这个问题?

2 个答案:

答案 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进行调用。这更加线程安全,并且拥有您需要的一切。