从另一个线程c#访问主窗体中的文本框组件

时间:2012-08-23 13:07:41

标签: c# multithreading c#-4.0 thread-safety

我有一个名为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?
   }
}

2 个答案:

答案 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";
        }
    }