我正在一个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
}
据我所知,事件处理器可能是要走的路,但我不能工作,如何在这种情况下这样做(我也接受其他的建议;))
任何帮助表示赞赏
不要紧,从类要更新的形式。 的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
}
}
在上述情况下,“这个”不通过。
你可以使用BackgroundWorker的,让您的其他线程,它让你与你的GUI轻松应对
http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx