1

サーバーからデータをダウンロードする 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");
    }
4

2 に答える 2

2

チェックを次のように変更してみてください。

if (richTextBox1.InvokeRequired) 
{
    richTextBox1.BeginInvoke(new SetRichTextTextDelegate(SetRichText),text); 
于 2012-09-26T10:01:38.683 に答える
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());

于 2012-09-26T10:08:07.673 に答える