使用委托进行交叉线程的C#麻烦

我有一个问题,使用委托从不是主窗体线程的线程更改文本框.

我有两个类,一个带有UI的主Form1.cs类和另一个类,LINClass.cs,我写了一个设备函数.
在Form1中,我启动了一个持续轮询设备的后台工作程序,以及另一个从设备中检索数据的线程(RXTask()),这两个线程的所有功能都来自LINCLass.cs.

从设备检索数据的线程包含一个委托,该委托指向允许更改Form1文本框的Form1.cs函数:

public class LINClass : Form
{
    private delegate void FormUpdater(int devnum, string rpm, string current, string temp);

//some other variables and procedure

public void RXTask()
{
    FormUpdater frmUpdt = new FormUpdater(Form1.GUIupdate);
    //other procedures and a loop containing the invoke...
    this.Invoke(frmUpdt, new object[]{devnum, rpm,
                                        current,
                                        temperature});

}

Form1类包含调用的方法,如下所示

public static void GUIupdate(int eWPnum, string rpm, string current, string temp)
{
    //take the parameters and write them in the textbox
}

现在当我运行代码时,线程正在运行但是在调用函数时我有一个异常.

http://s13.postimg.org/9ohuj9d7r/exception.png

它说,“InvalidOperationException未被管理,在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke”

最佳答案 您应该使用命令模式并将命令类从一个线程放入队列,并让另一个线程从中读取.

点赞