我正在努力学习交叉/多线程,但我对这个概念非常困惑。 我做了一个示例应用程序,假设通过一个线程在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;
}
有什么好办法让这个工作? 任何帮助是极大的赞赏。 我正在学习这种对编程的热爱。
答案 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}}