1

所以我有 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”从创建它的线程以外的线程访问。

我不明白我是如何为每个线程创建控件的,因此不胜感激。

还有一件事,用户能否在标签更新时单击停止按钮?还是我需要添加另一个等待用户输入的线程?

非常感谢!

4

4 回答 4

6

您只需要在 UI Thread 上设置 TextBox 值,而不是在其他线程上,因此您可以在 UI Thread 上使用Control.InvokeControl.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

.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 回答
0

你想要的是并行活动。MS 提供并行库,请通过以下链接

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 回答