从另一个类的后台线程更新GUI控件

时间:2012-09-26 09:55:09

标签: c#

我正在创建一个基于Windows的应用程序,它从服务器下载数据。 我正在使用在不同类上创建的后台线程来执行这些下载操作。我想继续在富文本框上显示下载状态,即在主线程上。但我无法做到这一点,得到一个跨线程操作无效。 请帮我解决这个问题。

Form1.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();
    }
demo.cs上的

方法

    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 个答案:

答案 0 :(得分:2)

尝试将支票更改为:

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

答案 1 :(得分: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());