[英]Threading and Objects in C# not working
private void btnCount_Click(object sender, EventArgs e)
{
Thread thread = new Thread(FuncX);
thread.Start();
FuncY();
}
public void FuncX()
{
this.Invoke(new MethodInvoker(delegate
{
//put UI thread code here.
//you can assign local variables values from the main thread in here as well. They are both accessible.
lblThreadDisplayX.Text = "0";
int x = Convert.ToInt32(lblThreadDisplayX.Text);
for (int j = 0; j < loopTime; j++)
{
x++;
lblThreadDisplayX.Text = x.ToString();
Thread.Sleep(5);
Update();
}
}));
}
public void FuncY()
{
lblThreadDisplayY.Text = "0";
int y = Convert.ToInt32(lblThreadDisplayY.Text);
for (int i = 0; i < loopTime; i++)
{
y++;
lblThreadDisplayY.Text = y.ToString();
Thread.Sleep(5);
Update();
}
}
}
}
上面是我正在努力使线程正常工作的测试人员的代码。 X和Y有2个标签,分别调用函数X和Y,在这些函数中,标签的文本反复递增1。 但是,我想同时进行。 当我尝试使用FuncX制作线程时,它说它无法访问在另一个线程中创建的对象并崩溃。 我使用了lock(){}
语句,但是没有用。 如何在线程内更改标签的文本?
编辑:更新了代码,这是Visual Studio 2008中的Windows窗体。在带有FuncX的线程中添加计时器会导致FuncY首先执行,然后执行FuncX的线程。
您的问题有两个方面:
1-不应在不首先锁定线程的情况下在线程之间共享控件或变量。 从技术上讲,您当时处于种族场景中,这可能会造成严重破坏。
2-标签是在主UI线程上创建的。 为了从线程内访问它们,您必须从子线程内调用主线程来进行访问……这又一次规避了线程的整个问题,因为您还使用了标签来“全局存储您的变量”。
但是,如果必须的话,下面是在线程中访问标签的方法:
要从线程或访问元素中执行代码:
this.Invoke(new MethodInvoker(delegate
{
//put UI thread code here.
//you can assign local variables values from the main thread in here as well. They are both accessible.
}));
仅提取对象的值或对象的属性(我在这里为您插入了占位符,此调用不是文字调用,您必须使其适应您的需求):
TypeName yourvar = (TypeName)this.Invoke(new Func<TypeName>(() => UICode here as TypeName));
希望这对您有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.