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