我有一个名为mainForm的类,它是我程序的主窗口。我在这个类中创建了一个TextBox(这个TextBox Logs程序)对象,我想为它编写程序状态。我是通过mainForm和其他对象(通过将TextBox对象传递给它)轻松实现的,但是当我想从另一个线程执行此操作时,它很复杂。 但是,我正在通过线程写入TextBox,它在mainForm中运行定义的代码(使用委托)。
我的问题是,如何在另一个类中运行的线程中写入TextBox?
public partial class mainForm : Form
{
TextBox log = new TextBox();
.
.
.
OtherClass o = new OtherClass(log);
}
class OtherClass
{
private TextBox log;
public otherClass(TextBox aLog)
{
log = aLog;
Thread thread = new Thrad(new ThreadStart(this.run));
thread.Start();
}
private void run()
{
log.Text = "Message";// I Can't Do This. Can I Use Delegate Here? How?
}
}
答案 0 :(得分:3)
您可以使用Invoke
/ BeginInvoke
:
log.BeginInvoke(
(Action)(() =>
{
log.Text = "Message";
}));
这允许辅助线程安全地将GUI更改转发到GUI线程,这是唯一应该应用它们的线程。
答案 1 :(得分:1)
使用已定义委托的另一种方法 - 这里的Xt可以在其他方法中重复使用,只要签名相同即可。参数也可以传递 - (然后在Xt委托中有参数,它的Invoke会为每个参数传递一个逗号分隔的列表。
private void run()
{
XteChangeText();
}
private delegate void Xt();
private void XteChangeText()
{
if (log.InvokeRequired)
{
Invoke(new Xt(XteChangeText));
}
else
{
log.Text="Message";
}
}