1

したがって、3つのラベルがあり、ユーザーがそれを停止するボタンをクリックするまで、乱数を使用して3つすべてを同時に更新する必要があります。

これは私がスタートボタンに持っているものです

private void start_Click(object sender, EventArgs e)
{
        t1 = new Thread(new ThreadStart(FirstNumber));
        t2 = new Thread(new ThreadStart(SecondNumber));
        t3 = new Thread(new ThreadStart(ThirdNumber));

        t1.Start();
        t2.Start();
        t3.Start();
}

乱数を生成するメソッドは次のようになります

public void FirstNumber()
{
        int j = r.Next(0, 50);
        int k = r.Next(50, 100);
        for (int i = j; i <= k; i++)
        {
            number1.Text = i.ToString();
            Thread.Sleep(200);
        }
}

デバッグすると、次のエラーが発生します。

クロススレッド操作が無効です:コントロール'number2'は、それが作成されたスレッド以外のスレッドからアクセスされました。

スレッドごとにコントロールを作成する方法がわからないので、助けていただければ幸いです。

もう1つ、ラベルの更新中にユーザーは停止ボタンをクリックできますか?または、ユーザー入力を待機する別のスレッドを追加する必要がありますか?

どうもありがとう!

4

4 に答える 4

6

他のスレッドではなく、UIスレッドでのみTextBox値を設定する必要があるため、UIスレッドでデリゲートを使用Control.Invokeまたは実行できます。Control.BeginInvoke

 number1.BeginInvoke(new Action(() => { number1.Text = i.ToString(); }));
于 2012-10-31T06:03:14.547 に答える
1

UIにアクセスできるのはUIスレッドのみです。Dispatcher.BeginInvoke()メソッドを使用してUIスレッドに投稿できます。

于 2012-10-31T06:03:02.823 に答える
0

必要なのは並列アクティビティです。MSはParallelライブラリを提供しています。以下のリンクを参照してください

http://www.codeproject.com/Articles/152765/Task-Parallel-Library-1-of-n

http://www.codeproject.com/Articles/362996/Multi-core-programming-using-Task-Parallel-Library

于 2012-10-31T06:10:05.057 に答える
0

.NETのスレッド間の同期通信には、SynchronizationContextがあります

// gui thread
var syncContext = System.Threading.SynchronizationContext.Current;

public void FirstNumber()
{
        int j = r.Next(0, 50);
        int k = r.Next(50, 100);
        for (int i = j; i <= k; i++)
        {
            // Post or Send mth
            syncContext.Post((o) => 
            {
             number1.Text = i.ToString();
            });

            Thread.Sleep(200);
        }
}
于 2012-10-31T08:59:50.877 に答える