C# 从另一个线程和类更新WinForm控件

C# 从另一个线程和类更新WinForm控件,c#,winforms,multithreading,class,controls,C#,Winforms,Multithreading,Class,Controls,我正在制作一个WinForms程序,它需要单独的线程 为了可读性和可维护性,我将所有非GUI代码划分为不同的类。该类还“生成”另一个类,该类执行一些处理。但是,我现在遇到了一个问题,我需要从另一个类中启动的线程更改WinForms控件(将字符串附加到textbox) 我四处搜索,找到了不同线程和不同类的解决方案,但不是两者都有,而且提供的解决方案(对我来说)似乎不兼容 这可能是最大的“潜在客户”,但是: 类层次结构示例: class WinForm : Form { ... Se

我正在制作一个WinForms程序,它需要单独的线程 为了可读性和可维护性,我将所有非GUI代码划分为不同的类。该类还“生成”另一个类,该类执行一些处理。但是,我现在遇到了一个问题,我需要从另一个类中启动的线程更改WinForms控件(将字符串附加到textbox)

我四处搜索,找到了不同线程和不同类的解决方案,但不是两者都有,而且提供的解决方案(对我来说)似乎不兼容

这可能是最大的“潜在客户”,但是:

类层次结构示例:

class WinForm : Form
{
    ...
    Server serv = new Server();
}

// Server is in a different thread to winform
class Server
{
    ...
    ClientConnection = new ClientConnection();
}

// Another new thread is created to run this class
class ClientConnection
{
    //Want to modify winform from here
}
我知道EventHandler可能是一种方法,但我不知道在这种情况下如何做(我也愿意接受其他建议;)


感谢任何帮助

您可以使用backgroundworker制作其他线程, 它允许您轻松处理GUI


从哪个类更新表单并不重要。WinForm控件必须在创建它们的同一线程上更新

因此,Control.Invoke允许您在自己的线程上对控件执行方法。这也称为异步执行,因为调用实际上是排队并单独执行的

看看这个,这个例子和你的例子很相似。单独线程上的单独类更新表单上的列表框

-----更新 在这里,您不必将其作为参数传递

在Winform类中,有一个可以更新控件的公共委托

class WinForm : Form
{
   public delegate void updateTextBoxDelegate(String textBoxString); // delegate type 
   public updateTextBoxDelegate updateTextBox; // delegate object

   void updateTextBox1(string str ) { textBox1.Text = str1; } // this method is invoked

   public WinForm()
   {
      ...
      updateTextBox = new updateTextBoxDelegate( updateTextBox1 ); // initialize delegate object
    ...
    Server serv = new Server();

}
从ClientConnection对象中,您必须获得对WinForm:Form对象的引用

class ClientConnection
{
   ...
   void display( string strItem ) // can be called in a different thread from clientConnection object
   {
         Form1.Invoke( Form1.updateTextBox, strItem ); // updates textbox1 on winForm
   }
}

在上述情况下,“this”未通过

这将是好的,但是它涉及到将“This”作为参数传递,我一直认为如果必须这样做,那么程序的结构是不好的。我可能完全错了:)你是对的,把‘this’作为参数传递不是个好主意。在这里,你没有通过“这个”。。请查看更新后的答案。这看起来不错,谢谢,但还有一个问题:“……您必须获得对WinForm:Form对象的引用。”是的。如果类clientConnection需要更新winForm对象,它必须能够引用它。一个选项是在构造clientConnection对象的过程中传递对winForm对象的引用,clientConnection对象可以存储它。这仍然意味着我必须将“this”传递给“Server”,但这只会有一个实例,所以我想这并不重要:L