c#make元素属于除主线程之外的某些线程

时间:2019-02-25 17:24:53

标签: c# multithreading winforms

我有一个c#Forms程序,如果连接了Arduino,该程序会多线程。如果是这样,将出现一个文本框,现在我会收到一个错误:

  

System.InvalidOperationException:“跨线程操作无效:控制'GyroForm'是从创建该线程的线程之外的线程访问的。'

来自的代码行是这样的:

outputBox.Width = this.Width - 150;

这没有显示文本框,但是无论采取任何措施都不能修改所述文本框。

我创建了一个名为“ updateOutputBox”的函数,它在自己的线程上。线程在这里初始化:

Thread outputBoxThread;

...

ThreadStart outputBoxRef = new ThreadStart(updateOutputBox);
outputBoxThread = new Thread(outputBoxRef);
outputBoxThread.Start();

这是我的updateOutputBox函数:

public void updateOutputBox() {

        while (true) {

            outputBox.Width = this.Width - 150;
            outputBox.Height = this.Height - (outputBox.Location.Y + 50);
            outputBox.Location = new Point(100, connectionStatus.Height + 50);
        }
    }

问题是我的文本框位于线程“ GyroForm”(我的项目)上,并且我希望它属于线程“ outputBoxThread”,这样我才不会遇到有关跨线程的任何错误。

如果没有办法做到这一点,那我该怎么做而不必为每个操作调用请求?

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试一下

public void updateOutputBox() {

    while (true) {
          if (outputBox.InvokeRequired)
           {
                 outputBox.Invoke(new MethodInvoker(delegate {
                     outputBox.Width = this.Width - 150;
                     outputBox.Height = this.Height - (outputBox.Location.Y + 50);
                     outputBox.Location = new Point(100, connectionStatus.Height + 50);
                }));
            }
    }
}
相关问题