交叉线程,访问除了它之外的线程

时间:2012-06-26 08:34:41

标签: c# thread-safety c#-2.0 multithreading

我正在努力学习交叉/多线程,但我对这个概念非常困惑。 我做了一个示例应用程序,假设通过一个线程在label.text上显示i。 它不起作用,因为我试图访问除了它之外的其他线程,我已经研究了很多,我仍然对Invoking,Delegation等感到困惑...... 这是我的代码:

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;
}

有什么好办法让这个工作? 任何帮助是极大的赞赏。 我正在学习这种对编程的热爱。

2 个答案:

答案 0 :(得分:7)

  

我正在尝试访问除

之外的其他线程

实际错误是访问创建它的线程以外的线程上的Windows窗体控件。

修复:使用Invoke

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

答案 1 :(得分: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; } 才能让它发挥作用。

{{1}}