4

クロス/マルチスレッドを学ぶために一生懸命努力していますが、その概念について非常に混乱しています。スレッド経由で label.text に i を表示するサンプルアプリケーションを作成しました。作成された以外のスレッドにアクセスしようとしているため、機能していません。多くのことを調査しましたが、呼び出し、委任などについてまだ混乱しています...これが私のコードです:

private void s1_Click(object sender, EventArgs e)
{
    Thread Thread1 = new Thread(new ThreadStart(Start1));
    Thread1.Start();
}

public void Start1()
{
    for (int i = 0; i < 1000; i++)
    {
        displaytext("Working.........", i);
        Thread.Sleep(100);
    }
}

public void displaytext(string thetext, int number)
{
    t1.Text = thetext + " " + number;
}

これを機能させる良い方法は何ですか? どんな助けでも大歓迎です。私はプログラミングへの愛のためにこれを学んでいます。

4

2 に答える 2

7

作成されたスレッド以外のスレッドにアクセスしようとしています

実際のエラーは、それを作成したスレッド以外のスレッドで Windows フォーム コントロールにアクセスすることです。

修正: を使用しますInvoke

public void Start1()
{
    for (int i = 0; i < 1000; i++)
    {
        t1.Invoke(() => displaytext("Working.........", i));
        Thread.Sleep(100);
    }
}
于 2012-06-26T08:38:59.293 に答える
2

Invoke関数を機能させるには、関数を通過させる必要がありdelegateます。

private void s1_Click(object sender, EventArgs e)  
{  
    Thread Thread1 = new Thread(new ThreadStart(Start1));  
    Thread1.Start();  
}  

public void Start1()  
{  
    for (int i = 0; i < 1000; i++)  
    {  
        if(t1.InvokeRequired)
        {
             t1.Invoke(new MethodInvoker( () => displaytext("Working.........", i)));  
        }
        else
        {
             displaytext("Working........", i);
        }
        Thread.sleep(100); 
    }  
}  

public void displaytext(string thetext, int number)  
{  
    t1.Text = thetext + " " + number;  
}  
于 2012-06-26T08:44:10.510 に答える