3

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

我四处搜索,找到了不同线程和不同类的解决方案,但并非两者兼而有之,提供的解决方案似乎不兼容(对我而言)

然而,这可能是最大的“线索”:How to update UI from another thread running in another class

类层次结构示例:

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
}

我知道事件处理程序可能是要走的路,但我不知道在这种情况下如何做(我也愿意接受其他建议;))

任何帮助表示赞赏

4

2 回答 2

11

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

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

从 msdn看这篇文章,例子和你的例子差不多。单独线程上的单独类更新窗体上的列表框。

----- 更新在这里你不必将它作为参数传递。

在您的 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' 没有通过。

于 2012-08-26T16:25:45.987 回答
-1

你可以使用 backgroundworker 来创建你的其他线程,它可以让你轻松处理你的 GUI

http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

于 2012-08-26T16:17:43.337 回答