2012-09-26 66 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());