1

可能重复:
为什么我收到此错误:“跨线程操作无效:控制 lbFolders 从创建它的线程以外的线程访问。”?
在创建窗口句柄之前,不能对控件调用 Invoke 或 BeginInvoke

我有线程问题。

我每 600 毫秒从 COM 端口获取数据,当我处于调试模式时,我会在几秒钟后收到错误消息,但是当我处于非调试运行模式时,我会在一两分钟后收到错误消息,但错误仍然存​​在。

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

这是错误的图片:

错误

代码的其他部分:

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

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

我能做些什么来解决这个问题?

4

2 回答 2

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";

        }
于 2012-08-28T12:27:49.533 回答
-1

调用 .Text 属性的编辑:

this.Invoke((MethodInvoker) delegate { brzina_ele.Text = "Its new value"; });

您还可以使用 Windows.Forms.Timer 的 Tick 事件进行调用。这更加线程安全,并且拥有您需要的一切。

于 2012-08-28T11:46:46.333 回答