更新的WinForm从另一个线程_and_类控制(Update WinForm Controls f

2019-06-27 09:34发布

我正在一个WinForms程序,这需要单独的线程出于可读性和可维护性,我已经分离出所有非GUI代码到不同的类别。 该类还“生成”另一个类,进行一些处理。 不过,我现在已经运行到哪里,我需要改变从在不同的类发起的线程的WinForms控制(字符串追加到文本框)的问题

我已经四处搜寻,找到了解决方案,为不同的线程,并在不同的班级,但不能同时和提供的解决方案显得格格不入(我)

这可能是最大的“铅”但是: 如何从另一个线程更新UI另一个类运行

类层次结构例如:

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
}

据我所知,事件处理器可能是要走的路,但我不能工作,如何在这种情况下这样做(我也接受其他的建议;))

任何帮助表示赞赏

Answer 1:

不要紧,从类要更新的形式。 的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
   }
}

在上述情况下,“这个”不通过。



Answer 2:

你可以使用BackgroundWorker的,让您的其他线程,它让你与你的GUI轻松应对

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



文章来源: Update WinForm Controls from another thread _and_ class