2012-09-26 50 views
1

我正在创建一个基于Windows的应用程序,它从服务器下载数据。 我使用在不同的类上创建的后台线程来执行这些下载操作。并且我想不断地显示富文本框上的下载状态,即在主线程上。但是我无法做到这一点,请不要执行跨线程操作有效。 请帮我解决这个问题。在Form1.cs的从另一个类的后台线程更新GUI控件

方法上demo.cs

public void UpdateRichText(string Text) 
{ 
    SetRichText(Text);      
} 

public delegate void SetRichTextTextDelegate(string text); 
public void SetRichText(object number) 
    {    
     if (InvokeRequired) 
     {     
      this.BeginInvoke(new SetRichTextTextDelegate(SetRichText),text);     
      return; 
     } 

     richTextBox1.Text += number.ToString() + "\n"; 
    } 
    private void button3_Click_1(object sender, EventArgs e) 
    { 
     demo d = new demo(); 
     d.display(); 
    } 

方法

Form1 f = new Form1(); 
    public void display() 
    {  
     Thread t = new Thread(new ThreadStart(call)); 
     t.Start(); 
    } 


    public void call() 
    { 
    //when i call this method every time if(InvokeRequired) is false. 
     f.UpdateRichText("Called from Thread"); 
    } 

回答

2

试着改变你的检查:

if (richTextBox1.InvokeRequired) 
{ 
    richTextBox1.BeginInvoke(new SetRichTextTextDelegate(SetRichText),text); 
+0

它不工作,如果(richTextBox1.InvokeRequired)是假的 – user1699826

+0

见进一步修改,将其更改为调用我创建了执行所有下载操作另一大类的RichTextBox –

+0

在上面的代码中提到。 – user1699826

1

尝试使用以下

  if (richTextBox1.InvokeRequired) 
      { 
       richTextBox1.Invoke(new Action(delegate { richTextBox1.Text += number.ToString() + "\n"; richTextBox1.ScrollToCaret(); })); 

      } 
      else 
      { 
       richTextBox1.Text += number.ToString() + "\n"; 
       richTextBox1.ScrollToCaret(); 
      } 

richTextBox1.Text + = number.ToString()+“\ n”;可以更改如下,

rtbEvents.AppendText(Environment.NewLine + number.ToString());